Main Content

MISRA C:2012 Rule 20.6

Tokens that look like a preprocessing directive shall not occur within a macro argument

Description

Rule Definition

Tokens that look like a preprocessing directive shall not occur within a macro argument.

Rationale

An argument containing sequences of tokens that otherwise act as preprocessing directives leads to undefined behavior.

Polyspace Implementation

Polyspace® looks for the # character in a macro arguments (outside a string or character constant).

Additional Message in Report

Macro argument shall not look like a preprocessing directive.

Troubleshooting

If you expect a rule violation but do not see it, refer to Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

#define M( A ) printf ( #A )

#include <stdio.h>

void foo(void){
    M(
#ifdef SW         /* Non-compliant */
    "Message 1"
#else
    "Message 2"   /* Compliant - SW not defined */
#endif            /* Non-compliant */
    );
}

This example shows a macro definition and the macro usage. #ifdef SW and #endif are noncompliant because they look like a preprocessing directive. Polyspace does not flag #else "Message 2" because after macro expansion, Polyspace knows SW is not defined. The expanded macro is printf ("\"Message 2\"");

Check Information

Group: Preprocessing Directives
Category: Required
AGC Category: Required