IBM Support

IZ67264: const declaration leads to bad result in C++

Subscribe

You can track all active APARs for this component.

APAR status

  • Closed as program error.

Error description

  • The provided test case produces an incorrect output
    at runtime due to the incorrect evaluation of
    !((~max_juint) == 0) within the 'if' statement.
    
    ===== COMPILE COMMAND:
    xlC_r -q64 test.cpp
    
    ===== TESTCASE:
    $ cat test.cpp
    /********************************/
    #include <stdio.h>
    
    typedef uint32_t juint;
    const juint   max_juint   = (juint)-1; /* 0xFFFFFFFF largest
    juint */
    
    int main()
    {
        printf("max_juint: 0x%x\n", max_juint);
        printf("~max_juint: 0x%x\n", ~max_juint);
        printf(" ((~max_juint) == 0) : %d\n", ((~max_juint) == 0));
        printf("!((~max_juint) == 0) : %d\n", !((~max_juint) == 0));
    
        if (!((~max_juint) == 0))
        {
           printf("*** error ***\n", max_juint);
        } else {
            printf("*** ok ***\n", max_juint);
        }
    
        return 0;
    }
    
    ===== ACTUAL OUTPUT:
    $ ./a.out
    max_juint: 0xffffffff
    ~max_juint: 0x0
     ((~max_juint) == 0) : 1
    !((~max_juint) == 0) : 0
    *** error ***
    $
    
    
    ===== EXPECTED OUTPUT:
    $ ./a.out
    max_juint: 0xffffffff
    ~max_juint: 0x0
     ((~max_juint) == 0) : 1
    !((~max_juint) == 0) : 0
    *** ok ***
    $
    

Local fix

  • Assign the value to a temp variable before evaluating the
    expression within the 'if'.
    
    eg:
    
    .
    .
    uint32_t temp = ~max_juint;
    if (!(temp == 0))
    {
            printf("*** error ***\n", max_juint);
    } else {
            printf("*** ok ***\n", max_juint);
    }
    .
    .
    

Problem summary

  • USER AFFECTED:
    Users using special const iteral type like HEX, in the logical
    comparison statement.
    
    PROBLEM DESCRIPTION:
    The compiler does not evaluate the non-integral literal type
    properly, causing the logic
    relation in the if-else statements is determined incorrectly.
    

Problem conclusion

  • xlCentry needs to choose proper routines to convert and
    evaluate the special const literal type.
    

Temporary fix

Comments

APAR Information

  • APAR number

    IZ67264

  • Reported component name

    XLC C++ AIX

  • Reported component ID

    5724S7100

  • Reported release

    900

  • Status

    CLOSED PER

  • PE

    NoPE

  • HIPER

    NoHIPER

  • Special Attention

    NoSpecatt

  • Submitted date

    2009-12-21

  • Closed date

    2009-12-21

  • Last modified date

    2010-01-05

  • APAR is sysrouted FROM one or more of the following:

    IZ65456

  • APAR is sysrouted TO one or more of the following:

Fix information

  • Fixed component name

    XLC C++ AIX

  • Fixed component ID

    5724S7100

Applicable component levels

  • R900 PSY U832412

       UP C



Document information

More support for: XL C/C++

Software version: 9.0

Reference #: IZ67264

Modified date: 05 January 2010


Translate this page: