BUG: Multiple Based Conversion Results May Be Incorrect
ID: Q168932
|
The information in this article applies to:
-
Microsoft Visual C++, 32-bit Editions, versions 2.0, 2.1, 2.2, 4.0, 4.1, 4.2, 5.0, 6.0
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
Additional query words:
Keywords : kbtool kbCompiler kbVC500bug kbVC600bug
Version : winnt:2.0,2.1,2.2,4.0,4.1,4.2,5.0,6.0
Platform : winnt
Issue type : kbbug