exponenta event banner

MISRA C:2012 Dir 4.10

Меры предосторожности должны приниматься для предотвращения многократного включения содержимого файла заголовка

Описание

Определение директивы

Меры предосторожности должны приниматься для предотвращения многократного включения содержимого файла заголовка.

Объяснение

Когда блок перевода содержит сложную иерархию вложенных заголовочных файлов, можно включать определенный заголовочный файл несколько раз, что приводит к путанице. Если это множественное включение приводит к нескольким или конфликтующим определениям, то программа может иметь неопределенное или ошибочное поведение.

Например, предположим, что файл заголовка содержит:

#ifdef _WIN64
   int env_var;
#elseif  
   long int env_var;
#endif
Если файл заголовка содержится в двух путях включения, один из которых определяет макрос _WIN64 и другой, который не определяет его, вы можете иметь противоречивые определения env_var.

Внедрение Polyspace

Если включить файл заголовка, содержимое которого не защищено от многократного включения, анализ приведет к нарушению этой директивы. Нарушение отображается в начале файла заголовка.

Содержимое файла заголовка можно защитить от многократного включения одним из следующих способов:

<start-of-file>
#ifndef <control macro>
#define <control macro>
    /* Contents of file */
#endif
<end-of-file>
или
<start-of-file>
#ifdef <control macro> 
#error ...
#else
#define <control macro>
    /* Contents of file */
#endif
<end-of-file>
Если не используется один из этих методов, Polyspace ® помечает включение файла заголовка как несоответствующее.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func(void);
#endif
void func2(void);

Если файл заголовка содержит этот код, он несовместим, так как защита макроса не покрывает все содержимое файла заголовка. Линия void func2(void) находится вне охраны.

Примечание

У вас могут быть комментарии за пределами макрозащиты.

void func(void);
#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func2(void);
#endif

Если файл заголовка содержит этот код, он несовместим, так как защита макроса не покрывает все содержимое файла заголовка. Линия void func(void) находится вне охраны.

Примечание

У вас могут быть комментарии за пределами макрозащиты.

#ifndef  __MY_MACRO__ 
#define __MY_MARCO__
    void func(void);
    void func2(void);
#endif

Если файл заголовка содержит этот код, он несовместим, поскольку имя макроса в #ifndef оператор отличается от имени в следующем #define заявление.

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

Группа: Дизайн кода
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b