If a constant value is given for an identifier, do not diminish the maintainability of the code in which it is used by assuming its value in expressions. Simply giving the constant a name is not enough to ensure modifiability; you must be careful to always use the name, and remember that the value can change. This recommendation is related to recommendation DCL06-C. Use meaningful symbolic constants to represent literal values.
...
The header stdio.h
defines the BUFSIZ
macro, which expands to an integer constant expression that is the size of the buffer used by the setbuf()
function. This noncompliant code example defeats the purpose of defining BUFSIZ
as a constant by assuming its value in the following expression:
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h>
/* ... */
nblocks = 1 + ((nbytes - 1) >> 9); /* BUFSIZ = 512 = 2^9 */
|
...
This compliant solution uses the identifier assigned to the constant value in the expression.:
Code Block | ||||
---|---|---|---|---|
| ||||
#include <stdio.h>
/* ... */
nblocks = 1 + (nbytes - 1) / BUFSIZ;
|
...
Assuming the value of an expression diminishes the maintainability of code and can produce unexpected behavior under any circumstances in which the constant changes.
Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
EXP07-C |
Low |
Unlikely |
Medium | P2 | L3 |
Automated Detection
Tool | Version | Checker | Description |
---|
Axivion Bauhaus Suite |
| CertC-EXP07 | |||||||
Helix QAC |
| C3120, C3121, C3122, C3123, C3131, C3132 | |||||||
LDRA tool suite |
|
201 S |
Fully |
implemented |
Related Vulnerabilities
Search for vulnerabilities resulting from the violation of this rule on the CERT website.
Related Guidelines
...
...
ISO/IEC 9899:1999 Section 6.10, "Preprocessing directives," and Section 5.1.1, "Translation environment"
Bibliography
[Plum 1985] | Rule 1-5 |
...
EXP06-C. Operands to the sizeof operator should not contain side effects 03. Expressions (EXP)