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: Требуется