BUG: /G3 /AL Options Generate Bad Code For Comparison to Long

Last reviewed: July 22, 1997
Article ID: Q115847
1.00 1.50 WINDOWS kbtool kbbuglist

The information in this article applies to:

  • The Microsoft C/C++ Compiler (CL.EXE), included with: Microsoft Visual C++ for Windows, versions 1.0 and 1.5

SYMPTOMS

The assembly code generated for the sample code below has an incorrect comparison to a long. This occurs when the /G3 compiler option (generate 386 instructions) is used in conjunction with the /AL option (large memory model).

RESOLUTION

There are two possible workarounds.

  1. use the /G2 compiler option (generate 286 code), rather than the /G3 compiler option

    -or-

  2. reverse the comparison expression. For example, in the sample code below, change the if statement to:

          if( (base == 10L) && (num < 0L) )
    
  • The if statement above will generate the correct 386 code.

    STATUS

    Microsoft has confirmed this to be a problem in the C++ compiler for MS-DOS, versions 8.0 and 8.0c. We are researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.

    MORE INFORMATION

    The following is a sample that demonstrates the code generation problem. The incorrect assembly code can be examined by looking at the .COD file produced.

    Sample Code

    /* Compile options: /AL /Fc /G3 /c
     */
    
    int go(long num, long base)
    
    {
       int negative;
       if( (num < 0L) && (base == 10L) )          // comparison
       {
    /*
    
    ; from the .cod file ; ; Line 7
         cmp   DWORD PTR [bp+8],655360;000a0000H  // should be 10 not 655360
         jne   SHORT $I107
         cmp   WORD PTR [bp+12],0
         jne   SHORT $I107
    */
          negative = 1;
          num = -num;
       }
       else negative = 0;
    
       return(negative);
    
    }

    int main()
    
    {
        long num, base;
    
        num = base = 10L;
        return(go(num, base));
    
    }


  • Additional reference words: 1.00 1.50 8.00 8.00c
    KBCategory: kbtool kbbuglist
    KBSubcategory: CodeGen
    Keywords : kb16bitonly


    THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

    Last reviewed: July 22, 1997
    © 1998 Microsoft Corporation. All rights reserved. Terms of Use.