Article ID: 135526 - Last Review: December 8, 2003 - Revision: 2.0

FIX: Bad Result If Call Inline Function Twice in Expression

This article was previously published under Q135526

On This Page

Expand all | Collapse all

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");
}
				

APPLIES TO
  • Microsoft Visual C++ 1.0 Professional Edition
  • Microsoft Visual C++ 1.5 Professional Edition
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52 Professional Edition
  • Microsoft Visual C++ 2.0 Professional Edition
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 4.2 Enterprise Edition
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 4.2 Professional Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
Keywords: 
kbbug kbfix kbnoupdate kbcodegen kbcpponly kbcompiler KB135526
 

Article Translations