ID: Q117203
6.00 6.00a 6.00ax 7.00 | 6.00 6.00a | 1.00
MS-DOS                 | OS/2       | WINDOWS
kbtool kbfixlist kbbuglist
The information in this article applies to:
    - Microsoft C for MS-DOS, versions 6.0, 6.0a, and 6.0ax
    - Microsoft C for OS/2, versions 6.0 and 6.0a
    - Microsoft C/C++ for MS-DOS, version 7.0
    - Microsoft Visual C++ for Windows, version 1.0
The compiler may treat an unsigned character pointer as an integer pointer when compiling using the /Ot option.
There are several ways to work around this problem:
-or-
-or-
Microsoft has confirmed this to be a problem with the C Compiler for MS- DOS, versions 6.0, 6.0a, 6.0ax, 7.0, and 8.0. This problem was corrected in the C/C++ compiler for MS-DOS, version 8.0c, included with Visual C++ for MS-DOS, version 1.5.
This problem does not occur with the 32-bit C/C++ Compiler, version 8.0, included with Visual C++ 32-bit Edition, version 1.0.
Using the /Fc option, you can generate an assembly listing of the source code. This is an excerpt from the assembly listing of the sample code below, which shows where the error occurs:
   ;|***    while(ch==*str);
   ; Line 8
                $FC180:
    *** 00000f  8b 5e fe        mov   bx,WORD PTR [bp-2]      ;str
    *** 000012  8b 37           mov   si,WORD PTR [bx]
    *** 000014  81 e6 ff 00     and   si,255  ;00ffH
    *** 000018  75 f5           jne   $FC180
Notice the code uses WORD PTR, when it should be using BYTE PTR.
The following is the code generated when one of the workarounds is used:
   ;    while(ch==*str);
   ; Line 8
                L00180:
    *** 000010  8b 5e fc         mov     bx,WORD PTR -4[bp]
    *** 000013  8a 07            mov     al,BYTE PTR [bx]
    *** 000015  25 ff 00         and     ax,OFFSET 255
    *** 000018  8b f0            mov     si,ax
    *** 00001a  8b c6            mov     ax,si
    *** 00001c  3d 00 00         cmp     ax,OFFSET 0
    *** 00001f  75 03 e9 00 00   je      L00181
    *** 000024  e9 e9 ff         jmp     L00180
/* Compile options needed: /Ot (/Fc to generate assembly listing)
*/ 
   #include<stdio.h>
   void main(void)
   {
      register int ch;
      unsigned char *str="abc";
      while(ch==*str);
   }
Additional reference words: 6.00 6.00a 6.00ax 7.00 8.00 1.00
KBCategory: kbtool kbfixlist kbbuglist
KBSubcategory: CodeGen
 
Keywords          : kb16bitonly kbCodeGen kbbuglist kbfixlist
Version           : 6.00 6.00a 6.00ax 7.00 | 6.00 6.
Platform          : MS-DOS OS/2 WINDOWS
Solution Type     : kbfix
Last Reviewed: September 22, 1997