Microsoft KB Archive/168932: Difference between revisions
From BetaArchive Wiki
m (Text replacement - ">" to ">") |
m (Text replacement - """ to """) |
||
Line 105: | Line 105: | ||
*/ | */ | ||
test1 = ( int __based(pBase)* )SomeFunction(); | test1 = ( int __based(pBase)* )SomeFunction(); | ||
printf( | printf( "Conversion 1 = %08X, should be 00000000\n", | ||
(unsigned long)test1 ); | (unsigned long)test1 ); | ||
Line 114: | Line 114: | ||
test1 = ( int __based(pBase)* )( (void __based(pBase)*) | test1 = ( int __based(pBase)* )( (void __based(pBase)*) | ||
((void*)0x00010000) ); | ((void*)0x00010000) ); | ||
printf( | printf( "Conversion 2 = %08X, should be 00000000\n", | ||
(unsigned long)test1 ); | (unsigned long)test1 ); | ||
Line 122: | Line 122: | ||
test1 = ( int __based(pBase)* )( ( void __based(pBase)* ) | test1 = ( int __based(pBase)* )( ( void __based(pBase)* ) | ||
pGlobal ); | pGlobal ); | ||
printf( | printf( "Conversion 3 = %08X, should be 00000000\n", | ||
(unsigned long)test1 ); | (unsigned long)test1 ); | ||
} | } |
Latest revision as of 11:04, 21 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