Parenthesize all variable names in macro definitions. See also PRE02.
Non-Compliant Code Example
This CUBE()
macro definition is non-compliant because it fails to parethesize the variable names.
#define CUBE(I) (I * I * I) int c = 81 / CUBE(2 + 1);
As a result, the invocation
int c = 81 / CUBE(2 + 1);
expands to
int a = 81 / (2 + 1 * 2 + 1 * 2 + 1); /* evalutaes to 11 */
while the desired behavior is
int a = 81 / ( (2 + 1) * (2 + 1) * (2 + 1)); /* evaluates to 3 */
Compliant Solution
Parenthesizing all variable namesthe in the{{CUBE()}} macro allows it to expand correctly (when invoked in this manner).
#define CUBE(I) ( (I) * (I) * (I) ) int c = 81 / CUBE(2 + 1);
Priority: P3 Level: L3
Component |
Value |
---|---|
Severity |
1 (low) |
Likelihood |
1 (unlikely) |
Remediation cost |
3 (low) |
References
- Summit 05 Question 10.1
- ISO/IEC 9899-1999 Section 6.10 Preprocessing directives