BUG: Multiple Based Conversion Results May Be Incorrect (168932)



The information in this article applies to:

  • Microsoft Visual C++ 2.0
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 2.2
  • Microsoft Visual C++ 4.0
  • Microsoft Visual C++ 4.1
  • Microsoft Visual C++, 32-bit Enterprise Edition 4.2
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 4.2
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET (2003)
  • Microsoft Visual C++ .NET (2002)

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
				

Modification Type:MajorLast Reviewed:9/18/2003
Keywords:kbBug kbCompiler KB168932