MISRA C:2012 Rule 8.5

Внешний объект или функция должны быть объявлены однажды в одном и только одном файле

Описание

Это средство проверки деактивировано в Polyspace по умолчанию® как Вы Анализ кода. Смотрите Средства проверки, Деактивированные в Polyspace, когда Вы Кодируете Анализ По умолчанию.

Управляйте определением

Внешний объект или функция должны быть объявлены однажды в одном и только одном файле.

Объяснение

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

  • Объявление и определение.

  • Объявления в различных модулях перевода.

Правило осуществляет практику объявления внешних объектов или функций в заголовочных файлах.

Реализация Polyspace

Средство проверки правила проверяет только явный extern объявления (предварительные определения проигнорированы). Средство проверки отмечает переменные или функции:

  • Заявленный extern в незаголовочном файле

  • Объявленный многократно, например, однажды в заголовке и однажды в незаголовочном файле.

Средство проверки игнорирует специфичные для компилятора непортативные способы заменить объявления функции, такие как pragma weak или __attribute__((weak)). Если вы объявляете слабый символ в своем коде и затем повторно объявляете символ позже, средство проверки считает redeclaration, как правило, нарушением. Если вы не хотите устранять проблему, добавьте комментарий в свой результат или код, чтобы избежать другого анализа. См.:

Polyspace Bug Finder™ и Polyspace Code Prover™ проверяют это правило кодирования по-другому. Исследования могут привести к различным результатам.

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

  • Объектный object_name имеет внешние объявления в нескольких файлах.

  • Функциональный function_name имеет внешние объявления в нескольких файлах.

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

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

/* file.h */
extern int var;
extern void func1(void);   /* Compliant */

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

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

extern void func2(void);   /* Non compliant */

/* Definitions */
int var = 0;
void func1(void) {}
В этом примере, объявлении внешнего функционального func2 несовместимо, потому что это происходит в незаголовочном файле. Другой внешний объект и объявления функции происходят в заголовочном файле и выполняют это правило.

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

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