MISRA C:2012 Rule 8.4

Совместимое объявление должно быть видно, когда определен объект или функция с внешним редактированием

Описание

Определение правила

Совместимое объявление должно быть видно, когда определен объект или функция с внешним редактированием.

Объяснение

Если объявление видим, когда объект или функция заданы, это позволяет компилятору проверить, что объявление и определение совместимы.

Это правило с MISRA C:2012 Rule 8.5 применяет практику объявления объекта (или функции) в заголовочном файле и включения файла заголовка в исходные файлы, которые определяют или используют объект (или функцию).

Реализация Polyspace

Средство проверки правил обнаруживает ситуации, когда:

  • Объект или функция определяются без предыдущего объявления.

  • Существует несоответствие типа данных между объявлением объекта или функции и определением. Такое несоответствие также вызывает ошибку компиляции.

Теперь проверка помечает предварительные определения (переменные, объявленные без extern спецификатор и не определен явным образом). Чтобы избежать нарушения правил, объявите переменную static (определено только в одном файле) или объявить переменную extern и следуйте описанию с определением.

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

  • Глобальное определение variable_name переменная не имеет предыдущего объявления.

  • Функциональные function_name не имеет видимого совместимого прототипа в определении.

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

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

Примеры

расширить все

Заголовочный файл:

/* file.h */
extern int var2; 
void func2(void);

Исходный файл:

/* file.c */
#include "file.h"

int var1 = 0;    /* Non compliant */
int var2 = 0;    /* Compliant */

void func1(void) {   /* Non compliant */
}

void func2(void) {   /* Compliant */
}

В этом примере определения var1 и func1 не совместимы, поскольку им не предшествуют объявления.

void func(int param1, int param2);

void func(int param1, unsigned int param2) { /* Non compliant */
}

В этом примере определение func имеет другой тип параметра по сравнению с его объявлением. Несоответствие объявления может привести к ошибке компиляции. Polyspace® флаги несоответствия.

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

Группа: Декларации и определения
Категория: Требуемая
Категория СМЖЛ: Консультационная
Введенный в R2014b