exponenta event banner

MISRA C:2012 Правило 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