Правило 8.6 MISRA C:2012

Идентификатор с внешней связью должен иметь точно одно внешнее определение

Описание

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

Идентификатор с внешней связью должен иметь точно одно внешнее определение.

Объяснение

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

Повторные определения в различных файлах не разрешены этим правилом, даже если определениями является то же самое.

Реализация Polyspace

Средство проверки отмечает повторные определения, только если определения происходят в различных файлах.

Средство проверки не рассматривает предварительные определения как определения. Например, следующий код не нарушает правило:

int val;
int val=1;

Средство проверки не показывает нарушение, если функция не задана вообще, но объявлена с внешней связью и вызвана в исходном коде.

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

Обменивайтесь сообщениями в отчете

  • Запрещенные повторные определения для функционального function_name.

  • Запрещенный несколько предварительных определений для объекта object_name.

  • Глобальная переменная variable_name умножается заданный.

  • Функциональный function_name умножается заданный.

  • Глобальная переменная имеет несколько предварительных определений.

  • Неопределенная глобальная переменная variable_name.

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

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

Первый исходный файл:

extern int var = 1;

Второй исходный файл:

int var = 0;   /* Non compliant */
В этом примере глобальная переменная, которая var, умножается заданный. Если явным образом не задано со спецификатором static, переменные имеют внешнюю связь.

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

/* file.h */
int func(int param);

Первый исходный файл:

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

int func(int param) {
    return param+1;
}

Второй исходный файл:

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

int func(int param) {  /* Non compliant */
    return param-1;
}

В этом примере функциональный func, умножаются заданный. Если явным образом не задано со спецификатором static, функции имеют внешнюю связь.

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

Группа: объявления и определения
Категория: необходимый
Категория AGC: необходимый
Язык: C90, C99

Введенный в R2014b