Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Local, automatic variables assume unexpected values if they are read before they are initialized.  The The C Standard, 6.7.911, paragraph 1011, specifies [ISO/IEC 9899:20112024]

If an object that has automatic storage duration is not initialized explicitly, its value representation is indeterminate.

See undefined behavior 11.

...

In this noncompliant code example described in "More Randomness or Less" [Wang 2012], the process ID, time of day, and uninitialized memory junk is used to seed a random number generator. This behavior is characteristic of some distributions derived from Debian Linux that use uninitialized memory as a source of entropy because the value stored in junk is indeterminate. However, because accessing an indeterminate value is undefined behavior 11, compilers may optimize out the uninitialized variable access completely,  leaving leaving only the time and process ID and resulting in a loss of desired entropy.

...

The realloc() function changes the size of a dynamically allocated memory object. The initial size bytes of the returned memory object are unchanged, but any newly added space is uninitialized, and its value is indeterminate. As in the case of malloc(), accessing memory beyond the size of the original object is undefined behavior 181186.

It is the programmer's responsibility to ensure that any memory allocated with malloc() and realloc() is properly initialized before it is used.

...

Reading uninitialized variables is undefined behavior 20 and can result in unexpected program behavior. In some cases, these security flaws may allow the execution of arbitrary code.

Reading uninitialized variables for creating entropy is problematic because these memory accesses can be removed by compiler optimization. VU#925211 is an example of a vulnerability caused by this coding error.

Rule

Severity

Likelihood

Detectable

Remediation CostRepairable

Priority

Level

EXP33-C

High

Probable

No

YesMedium

P12

L1

Automated Detection

Detects uninitialized variables, uninitialized pointers, uninitialized struct members, and uninitialized array elements (However, if one element is initialized, then cppcheck assumes the array is initialized.)
There are FN compared to some other tools because Cppcheck tries to avoid FP in impossible paths. variable
  • Non-initialized pointer
  • Rule partially covered

    2961, 2962, 2963, 2966, 2967, 2968, 2971,

    2972, 2973, 2976, 2977, 2978

    ToolVersionCheckerDescription
    Astrée
    Include Page
    Astrée_V
    Astrée_V

    uninitialized-local-read

    uninitialized-variable-use

    Fully checked
    Axivion Bauhaus Suite

    Include Page
    Axivion Bauhaus Suite_V
    Axivion Bauhaus Suite_V

    CertC-EXP33
    CodeSonar
    Include Page
    CodeSonar_V
    CodeSonar_V
    LANG.MEM.UVARUninitialized variable
    Compass/ROSE

    Automatically detects simple violations of this rule, although it may return some false positives. It may not catch more complex violations, such as initialization within functions taking uninitialized variables as arguments. It does catch the second noncompliant code example, and can be extended to catch the first as well

    Coverity
    Include Page
    Coverity_V
    Coverity_V

    UNINIT

    Implemented
    Cppcheck
    Include Page
    Cppcheck_V
    Cppcheck_V

    uninitvar
    uninitdata
    uninitstring
    uninitMemberVar
    uninitStructMember


    Cppcheck Premium

    Include Page
    Cppcheck Premium_V
    Cppcheck Premium_V

    uninitvar
    uninitdata
    uninitstring
    uninitMemberVar
    uninitStructMember

    GCC4.3.5

    Can detect some violations of this rule when the -Wuninitialized flag is used

    Helix QAC

    Include Page
    Helix QAC_V
    Helix QAC_V

    DF2726, DF2727, DF2728, DF2961, DF2962, DF2963, DF2966, DF2967, DF2968, DF2971, DF2972, DF2973, DF2976, DF2977, DF2978

    Fully implemented
    Klocwork
    Include Page
    Klocwork_V
    Klocwork_V

    UNINIT.HEAP.MIGHT
    UNINIT.HEAP.MUST
    UNINIT.STACK.ARRAY.MIGHT
    UNINIT.STACK.ARRAY.MUST
    UNINIT.STACK.ARRAY.PARTIAL.MUST
    UNINIT.STACK.MIGHT
    UNINIT.STACK.MUSTUNINIT.CTOR.MIGHT
    UNINIT.CTOR.MUST

    Fully implemented
    LDRA tool suite
    Include Page
    LDRA_V
    LDRA_V

    53 D, 69 D, 631 S, 652 S

    Fully implemented

    Parasoft C/C++test

    Include Page
    Parasoft_V
    Parasoft_V

    CERT_C-EXP33-a

    Avoid use before initialization

    Parasoft Insure++

    Include Page
    Parasoft_V
    Parasoft_V


    Runtime analysis
    PC-lint Plus

    Include Page
    PC-lint Plus_V
    PC-lint Plus_V

    530, 603, 644, 901

    Fully supported

    Polyspace Bug Finder

    Include Page
    Polyspace Bug Finder_V
    Polyspace Bug Finder_V

    CERT C: Rule EXP33-C


    Checks for:

    • Non-initialized
    PRQA QA-C
    Include Page
    PRQA QA-C_v
    • variable
    • Non-initialized pointer

    Rule partially covered

    PRQA QA-C_v

    2726, 2727, 2728, 2961, 2962, 2963, 2966,

    2967, 2968, 2971, 2972, 2973, 2976, 2977,

    2978

    Fully implementedPRQA QA-C++
    Include Page
    cplusplus:PRQA QA-C++_Vcplusplus:PRQA QA-C++_V
    PVS-Studio

    Include Page
    PVS-Studio_V
    PVS-Studio_V

    V573, V614, V670, V679, V1050

    RuleChecker
    Include Page
    RuleChecker_V
    RuleChecker_V

    uninitialized-local-read

    Partially checked
    Security Reviewer - Static Reviewer
    6.02
    C54
    C55
    C56
    C57
    C58
    C59
    C60
    C61
    C62
    C63
    Fully implemented
    Splint3.1.1

    TrustInSoft Analyzer

    Include Page
    TrustInSoft Analyzer_V
    TrustInSoft Analyzer_V

    initialisation
    Exhaustively verified (see one compliant and one non-compliant example).

    Related Vulnerabilities

    CVE-2009-1888 results from a violation of this rule. Some versions of SAMBA (up to 3.3.5) call a function that takes in two potentially uninitialized variables involving access rights. An attacker can exploit these coding errors to bypass the access control list and gain access to protected files [xorl 2009].

    ...

    [Flake 2006]
    [ISO/IEC 9899:20112024]Subclause 6.7.911, "Initialization"
    Subclause 6.2.6.1, "General"
    Subclause 6.3.2.1, "Lvalues, Arrays, and Function Designators"
    [Mercy 2006]
    [VU#925211]
    [Wang 2012]"More Randomness or Less"
    [xorl 2009]"CVE-2009-1888: SAMBA ACLs Uninitialized Memory Read"

    ...