BUG: Incorrect Code When Increment Pointer Based on a PointerLast reviewed: July 24, 1997Article ID: Q122543 |
The information in this article applies to:
SYMPTOMSIncorrect 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 CAUSEThe 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 RESOLUTIONSplit the statement into multiple lines. For example,
*(char _based(pvbuf) *)(((char *)Test)) = '5'; ((char*)Test)++; STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this bug and will post new information here in the Microsoft Knowledge Base as it becomes available.
MORE INFORMATIONThe following sample demonstrates both the problem and its solution.
Sample Code
/* Compile options needed: none */ #include <stdio.h> #include <conio.h> char buf[100]; void *pvbuf=buf; unsigned int _based(pvbuf) *Test; 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: 8.00 8.00c 9.00 10.00 10.10 10.20
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |