Article: Q67786
Product(s): See article
Version(s): 6.00 6.00a | 6.00 6.00a
Operating System(s): MS-DOS | OS/2
Keyword(s): ENDUSER | buglist6.00 buglist6.00a | mspl13_c
Last Modified: 6-FEB-1991
The sample program below does not compile properly when using any
optimizations other than /Od under C versions 6.00 and 6.00a. The code
generated by the compiler incorrectly assumes that foo and bar are
equal after the call to the function inc_foo. The compiler then
accesses bar[1] by using the value of foo rather than the value of
bar. This generates the wrong effect on the array being modified.
There are several workarounds:
1. Use the /Od option or the /qc option.
2. Declare foo as a volatile pointer to a char.
3. Change the code to assign buf to bar first.
Microsoft has confirmed this to be a problem in C versions 6.00 and
6.00a. We are researching this problem and will post new information
here as it becomes available.
Sample Code
-----------
#include <stdio.h>
char inc_foo (void);
char * foo;
char * bar;
char * buf = "....................";
main ()
{
foo= buf;
bar= buf;
bar[1]= inc_foo ();
printf ("buf = %s\n", buf);
printf ("foo = %d\nbar = %d\n", foo, bar);
}
char inc_foo ()
{
foo += 10;
return (char) '[';
}
The correct output is:
buf = .[..................
foo = 76
bar = 66
The output generated is:
buf = ...........[........
foo = 76
bar = 66