Versions Compared

Key

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

...

Non-Compliant Code Example

The problem Expected behavior resulting from macro expansion is not limited to function-like macros. This object-like macro definition in this example is non-compliant because the macro expansion is not parenthesized.

Code Block
bgColor#FFcccc
#define sum a+b
/* ... */
int result = sum*4;

The value of result is a+(b*4) instead of the expected (a+b)*4.

 Compliant Compliant Solution

Parenthesizing the macro yields the expected answer.

...

Note that there must be a space after sum, otherwise it becomes a function-like macro.

Exceptions

PRE02-EX1. A macro that expands to a single identifier or function call will does not change the precedence of any operators in the surrounding expression, so it need not be parenthesized.

...

 Risk Assessment

Failing to parenthesize around a function-like macro expansions can result in unexpected arithmetic results.

Rule

Severity

Likelihood

Remediation Cost

Priority

Level

PRE02-A

1 (low)

1 (unlikely)

3 (low)

P3

L3

Search for vulnerabilities resulting from the violation of this rule on the CERT website.

References

Wiki Markup
\[[Summit 05|AA. C References#Summit 05]\] Question 10.1
\[[ISO/IEC 9899-1999|AA. C References#ISO/IEC 9899-1999]\] Section 6.10, "Preprocessing directives," and Section 5.1.1, "Translation environment"
\[[Summit 05|AA. C References#Summit 05]\] Question 10.1