Microsoft KB Archive/168932

From BetaArchive Wiki

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