Microsoft KB Archive/168932

= BUG: Multiple Based Conversion Results May Be Incorrect =

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.



Steps to Reproduce Behavior
/* Compiler options: Use .cpp extension or /Tp switch */
 * 1) include 

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

-

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

© Microsoft Corporation. All rights reserved.