IBM Support

LI75346: CONST DECLARATION RESULTS IN BAD OUTPUT

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

    LI75346

  • Reported component name

    XL C/C++ RHEL5

  • Reported component ID

    5724S7310

  • Reported release

    900

  • Status

    CLOSED PER

  • PE

    NoPE

  • HIPER

    NoHIPER

  • Special Attention

    NoSpecatt

  • Submitted date

    2010-03-11

  • Closed date

    2010-03-11

  • Last modified date

    2010-03-11

  • 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

    XL C/C++ RHEL5

  • Fixed component ID

    5724S7310

Applicable component levels

[{"Business Unit":{"code":"BU054","label":"Systems w\/TPS"},"Product":{"code":"SSJT9L","label":"XL C\/C++"},"Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"9.0","Line of Business":{"code":"LOB08","label":"Cognitive Systems"}}]

Document Information

Modified date:
16 October 2021