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 имеет различный тип параметра от его объявления. Несоответствие также вызывает ошибку компиляции.

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

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

Введенный в R2014b