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


Last Reviewed: May 18, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.