Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Based on a recommendation from Jeff Muller.

Wiki Markup
The macro expansion should always be parenthesized within a function-like macro to protect any lower-precedence operators from the surrounding expression.  See also \[[PRE00-A. Prefer inline functions to macros]\] and \[[PRE01-A. Use parentheses within macros around parameter names]\].

Non-Compliant Code Example

This CUBE() macro definition is non-compliant because it fails to parenthesize the macro expansion.

...

which is not the desired behavior.

Compliant Solution

By parenthesizing the macro expansion, the CUBE() macro expands correctly (when invoked in this manner).

Code Block
bgColor#ccccff
#define CUBE(X) ((X) * (X) * (X))
int i = 3;
int a = 81 / CUBE(i);

...

Non-Compliant Code Example

The problem is not limited to function-like macros.

Code Block
bgColor#FFcccc

#define sum 2+3
int result = sum*4;

The value of result is 14 instead of the expected 20.

 Compliant Solution

Parenthesizing the macro yields the expected answer.

Code Block
bgColor#ccccff

#define sum (2+3)
int result = sum*4;	/* 20 */

 Risk Assessment

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

...

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"