Microsoft KB Archive/112564

From BetaArchive Wiki

BUG: Bad Code for Comparison of long When Compiling for 80386

Q112564

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 compiler generates incorrect code for a comparison involving a variable of type long. The generated code may crash or behave unpredictably if the code is compiled with /G3, to target the 80386 processor. CAUSE ===== In comparisons involving more than one long variable, the compiler may generate incorrect code when the /G3 option is used. RESOLUTION ========== To avoid the problem, one option is to use the /G2 compiler switch instead of the /G3 compiler switch. Another option is to break up the boolean expression that involves more than one long variable comparison, as demonstrated in the sample below. STATUS ====== Microsoft has confirmed this to be a problem in C/C++ 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. This is not a problem in the 32-bit compiler. MORE INFORMATION ================ Sample Code ----------- /* Compile options needed: /f- /G3 */ #include #include struct test { long field1; long field2; }; void main () { int bTest; struct test * pTest; pTest= (struct test *) malloc (sizeof (struct test)); pTest->field1= -8L; if ((0 > pTest->field1) && (pTest->field1 != -8L)) { printf ("Error - small negative - this should not execute\n"); } // Work around for this test starts here! bTest= (0 > pTest->field1); bTest= (bTest && (pTest->field1 != -8L)); if (bTest) printf ("The work around failed\n"); else printf ("This is the work around\n"); pTest->field1= -65544L; if ((0 > pTest->field1) && (pTest->field1 != -65544L)) { printf ("Error - large negative - this should not execute\n"); } // Work around for this test starts here! bTest= (0 > pTest->field1); bTest= (bTest && (pTest->field1 != -65544L)); if (bTest) printf ("The work around failed\n"); else printf ("This is the work around\n"); pTest->field1= 8L; if ((0 < pTest->field1) && (pTest->field1 != 8L)) { printf ("Error - small positive - this will not execute\n"); } pTest->field1= 65544L; if ((0 < pTest->field1) && (pTest->field1 != 65544L)) { printf ("Error - large positive - this will not execute\n"); } } Additional reference words: 8.00 8.00c 1.00 1.50 KBCategory: kbtool kbbuglist KBSubcategory: CodeGen

Keywords : kb16bitonly
Issue type : kbbug
Technology : kbVCsearch kbAudDeveloper kbCVCComp


Last Reviewed: May 5, 2001
© 2001 Microsoft Corporation. All rights reserved. Terms of Use.