Knowledge Base

FIX: Bad Result If Call Inline Function Twice in Expression

Article ID: 135526

Article Last Modified on 12/8/2003


APPLIES TO


This article was previously published under Q135526

SYMPTOMS

Invalid results may be generated under these conditions:
  • Your code defines an inline function that uses global or static data, and it invokes that function twice within an expression.
  • You are using the /Ob1 or /Ob2 or /Ox compiler optimization switch with the 32-bit compiler, or you are using the /Ob1g or /Ob2g or /Ox switch with the 16-bit compiler.
  • The global or static variable appears in the return expression for the function.

RESOLUTION

Do not use the above optimizations.

-or-

Assign the return value of one of the function calls to a local variable. Then use the local variable in the expression.

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.

This problem was corrected in Microsoft Visual C++ .NET.

MORE INFORMATION

Sample Code to Reproduce the Problem

/* Compile options needed 32-bit Compiler: /Ob1, or /Ob2, or /Ox
/* Compile options needed 16-bit Compiler: /Ob1g, or /Ob2g, or /Ox
*/ 

#include <stdio.h>

int  nGlobal = 0;

inline int test(int nIn) {
   return  nGlobal = nIn;
}

void main() {
   // This will incorrectly evaluate to true.
   if  (test(1) == test(2))
       printf("test(1) == test(2)\n");
   else
       printf("test(1) != test(2)\n");

   // This will correctly evaluate to false.
   int n = test(2);

   if  (test(1) == n)
       printf("test(1) == test(2)\n");
   else
       printf("test(1) != test(2)\n");
}
				

Additional query words: kbVC400bug 8.00c 9.00 9.10 10.00 10.10 10.20

Keywords: kbbug kbfix kbnoupdate kbcodegen kbcpponly kbcompiler KB135526