Microsoft KB Archive/122543

= BUG: Incorrect Code When Increment Pointer Based on a Pointer =

Article ID: 122543

Article Last Modified on 7/5/2005

-

APPLIES TO


 * Microsoft Visual C++ 1.0 Professional Edition
 * Microsoft Visual C++ 2.0 Professional Edition
 * Microsoft Visual C++ 2.1
 * Microsoft Visual C++ 4.0 Standard Edition
 * Microsoft Visual C++ 4.1 Subscription
 * Microsoft Visual C++ 5.0 Enterprise Edition
 * Microsoft Visual C++ 6.0 Enterprise Edition
 * Microsoft Visual C++ 5.0 Professional Edition
 * Microsoft Visual C++ 6.0 Professional Edition
 * Microsoft Visual C++ 5.0 Learning Edition
 * Microsoft Visual C++ 6.0 Standard Edition

-



This article was previously published under Q122543



SYMPTOMS
Incorrect code is generated when an assignment is made in the same statement where a pointer based on a pointer is incremented.

For example, executing the following code: char buf[100]; void *pvbuf=buf; unsigned int _based(pvbuf) *Test;

*(char _based(pvbuf) *)(((char *)Test)++) = '6' in a Win32-based application causes an application error; executing the same code in a 16-bit Windows-based application causes this error:

run-time error R6001 -null pointer assignment



CAUSE
The compiler generates an unnecessary sub command, as shown here: mov bx,WORD PTR _Test sub bx,WORD PTR _pvbuf    ; Not needed mov si,WORD PTR _pvbuf mov BYTE PTR [bx][si],5 inc WORD PTR _Test



RESOLUTION
Split the statement into multiple lines. For example, *(char _based(pvbuf) *)(((char *)Test)) = '5'; ((char*)Test)++;



STATUS
Microsoft has confirmed that this is a bug in the Microsoft products that are listed at the beginning of this article.



MORE INFORMATION
The following sample demonstrates both the problem and its solution.

Sample Code
/* Compile options needed: none

char buf[100]; void *pvbuf=buf; unsigned int _based(pvbuf) *Test;
 * 1) include 
 * 2) include 

void good {  *(char _based(pvbuf) *)(((char *)Test)) = '5'; ((char*)Test)++; *(char _based(pvbuf) *)(((char *)Test)) = '5'; }

void bad {  *(char _based(pvbuf) *)(((char *)Test)++) = 6; }

void main(void) {  good; printf( "Should print out: 5 5 \n%c %c\n",buf[0],buf[1] ); getch; bad; printf( "Should print out: 5 6 \n%c %c\n",buf[0],buf[1] ); }

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

Keywords: kbbug kbcodegen KB122543

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.