Microsoft KB Archive/168932: Difference between revisions
From BetaArchive Wiki
m (Text replacement - "<" to "<") |
m (Text replacement - ">" to ">") |
||
Line 81: | Line 81: | ||
<pre class="codesample">/* Compiler options: Use .cpp extension or /Tp switch */ | <pre class="codesample">/* Compiler options: Use .cpp extension or /Tp switch */ | ||
#include <stdio.h | #include <stdio.h> | ||
Revision as of 20:43, 20 July 2020
Article ID: 168932
Article Last Modified on 9/18/2003
APPLIES TO
- 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++ 6.0 Standard Edition
- Microsoft Visual C++ .NET 2003 Standard Edition
- Microsoft Visual C++ .NET 2002 Standard Edition
This article was previously published under Q168932
SYMPTOMS
When you perform multiple conversions on pointers that are declared with the __based keyword, that have the same base, and are compiled as C++, the conversion results may be incorrect.
RESOLUTION
To work around this problem, limit __based type conversions to one. The sample code below demonstrates how to implement some workarounds.
STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article.
MORE INFORMATION
Steps to Reproduce Behavior
/* Compiler options: Use .cpp extension or /Tp switch */ #include <stdio.h> void *pBase = (void*)0x00010000; void *pGlobal = (void*)0x00010000; void __based(pBase)* SomeFunction() { static void* pv = (void*)0x00010000; return( void __based(pBase)* )pv; } void main() { int __based(pBase)* test1; /* The following conversion always fails. A possible solution is to have SomeFunction() simply return a void*. */ test1 = ( int __based(pBase)* )SomeFunction(); printf( "Conversion 1 = %08X, should be 00000000\n", (unsigned long)test1 ); /* This conversion fails on some versions. In this example, the double conversion isn't necessary. */ test1 = ( int __based(pBase)* )( (void __based(pBase)*) ((void*)0x00010000) ); printf( "Conversion 2 = %08X, should be 00000000\n", (unsigned long)test1 ); /* This conversion always works. */ test1 = ( int __based(pBase)* )( ( void __based(pBase)* ) pGlobal ); printf( "Conversion 3 = %08X, should be 00000000\n", (unsigned long)test1 ); }
Output:
Conversion 1 = FFFF0000, should be 00000000 Conversion 2 = 00010000, should be 00000000 Conversion 3 = 00000000, should be 00000000
Keywords: kbbug kbcompiler KB168932