KnowledgeBase Archive

An Archive of Early Microsoft KnowledgeBase Articles

View on GitHub

Q62912: Bad Code Generated for Difference Between Huge Pointers

Article: Q62912
Product(s): See article
Version(s): 6.00   | 6.00
Operating System(s): MS-DOS | OS/2
Keyword(s): ENDUSER | buglist6.00 | mspl13_c
Last Modified: 13-JUN-1990

The following code demonstrates a case in which the C Compiler version
6.00 generates incorrect results when calculating the difference
between two huge pointers.

Note that the pointer must address an array element inside of a
structure for this problem to occur. Changing the types of the array
elements, etc., does not solve the problem.

Sample Code
-----------

#include <stdio.h>

struct s_type {
            int ary[2]; /* Note: MUST point to array element inside
                                                     struct */
            int l;
       } s, *sptr;

int * lptr1;
long long2;

void main ( void )
{
    sptr = &s;
    printf ( " &(sptr->ary[1]) is at %p\n", &(sptr->ary[1]) ) ;

    lptr1 = & ( sptr -> ary[1] ) ;
    printf ( "lptr1 is at %p\n\n", lptr1 ) ;

    long2 =  lptr1 - &(sptr->ary[1]) ;  /* This should be 0 */
    printf ( "difference is %ld bytes\n", long2 ) ;

}

Compile the above program with the following:

   cl /AH /W4 /Od test.c

When you run the program, the first two addresses should be the same
because they are pointing to the same location. The third printf()
should return 0 (zero) bytes. However, under a huge model, you will
get an incorrect return value.

One workaround is to use the quick compiler (/qc option), as follows:

   cl /qc /AH /W4 /Od test.c

This will generate the correct code.

Microsoft has confirmed this to be a problem in C version 6.00. We are
researching this problem and will post new information here as it
becomes available.

THE INFORMATION PROVIDED IN THE MICROSOFT KNOWLEDGE BASE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. MICROSOFT DISCLAIMS ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING THE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL MICROSOFT CORPORATION OR ITS SUPPLIERS BE LIABLE FOR ANY DAMAGES WHATSOEVER INCLUDING DIRECT, INDIRECT, INCIDENTAL, CONSEQUENTIAL, LOSS OF BUSINESS PROFITS OR SPECIAL DAMAGES, EVEN IF MICROSOFT CORPORATION OR ITS SUPPLIERS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF LIABILITY FOR CONSEQUENTIAL OR INCIDENTAL DAMAGES SO THE FOREGOING LIMITATION MAY NOT APPLY.

Copyright Microsoft Corporation 1986-2002.