BUG: Bad Code for Case 0xFFFFFFFF in Switch on Unsigned Long

ID: Q113117

7.00 | 1.00 1.50 MS-DOS | WINDOWS kbtool kbbuglist

The information in this article applies to:

SYMPTOMS

The compiler generates incorrect code for a switch statement on an unsigned long variable involving a case 0xFFFFFFFF. The generated code may crash or behave unpredictably if the code is compiled with the /f- compiler switch.

CAUSE

In switch statements involving a case 0xFFFFFFFF or case -1L, the compiler may generate incorrect code when the /f- option is used.

RESOLUTION

To avoid the problem, one option is to use the /f compiler switch instead of the /f- compiler switch. Another option is to change the switch statement to switch on a signed long instead of an unsigned long.

STATUS

Microsoft has confirmed this to be a problem in C/C++ for MS-DOS versions 7.0, 8.0, and 8.0c. We are researching this problem and will post new information here in the Microsoft Knowledge Base as it becomes available.

Sample Code

/* Compile options needed: /f-
*/ 

#include <stdio.h>

void func (unsigned long dVar)
{
    switch (dVar)
    {
    case 0:
        printf ("Error - switch on 0xFFFFFFFF went to 0\n");
        break;
    case 0xFFFFFFFFUL:
        printf ("Switch statement was successful\n");
        break;
    default:
        printf ("Error - switch on 0xFFFFFFFF went to default\n");
        break;
    }
}

void main ()
{
    func (0xFFFFFFFFUL);
}

Additional reference words: 1.00 1.50 7.00 8.00 8.00c fast compile KBCategory: kbtool kbbuglist KBSubcategory: CodeGen Keywords : kb16bitonly

Last Reviewed: July 23, 1997