Section 6.5.2.5 of the C standard [ISO/IEC 9899:2011] defines a compound literal as
...
The storage for this object is either static (if the compound literal occurs at file scope) or automatic (if the compound literal occurs at block scope), and the storage duration is associated with its immediate enclosing block [ISO/IEC 9899:2011].
For example, in the function
...
Note that only one object is created per compound literal—even if the compound literal appears in a loop and has dynamic initializers [ISO/IEC 9899:2011].
This recommendation is a specific instance of DCL30-C. Declare objects with appropriate storage durations.
...
Because the storage duration of the compound literal is associated with the for
loop that contains it, dereferencing ints
in the second loop results in undefined behavior 9 (Annex J of the C standard [ISO/IEC 9899:2011]).
Even if the region of memory that contained the compound literal is not written to between loops, the print loop will display the value MAX_INTS-1
for MAX_INTS
lines. This is contrary to the intuitive expected result, which is that the integers 0
through MAX_INTS-1
would be printed in order.
...
Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
DCL21-C | low | unlikely | medium | P2 | L3 |
Related Guidelines
ISO/IEC 9899:2011 Section Section 6.5.2.5, "Compound literals"
...