MISRA C:2012 Rule 20.6

Лексемы, которые похожи на директиву предварительной обработки, не должны происходить в макро-аргументе

Описание

Управляйте определением

Лексемы, которые похожи на директиву предварительной обработки, не должны происходить в макро-аргументе.

Объяснение

Аргумент, содержащий последовательности лексем, которые в противном случае действуют как предварительная обработка директив, приводит к неопределенному поведению.

Реализация Polyspace

Polyspace® ищет # символ в макро-аргументы (вне строковой или символьной константы).

Дополнительное сообщение в отчете

Макро-аргумент не должен быть похожим на директиву предварительной обработки.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

развернуть все

#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 */
    );
}

Этот пример показывает макроопределение и макро-использование. #ifdef SW и #endif несовместимы, потому что они похожи на директиву предварительной обработки. Polyspace не делает флага #else "Message 2" потому что после макрорасширения, Polyspace знает SW не задан. Расширенным макросом является printf ("\"Message 2\"");

Проверяйте информацию

Группа: предварительная обработка директив
Категория: необходимый
Категория AGC: необходимый