exponenta event banner

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

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

Описание

Эта проверка деактивируется в анализе Polyspace ® по умолчанию в качестве кода. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

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

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

Объяснение

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

Несколько определений в разных файлах не допускаются этим правилом, даже если определения совпадают.

Внедрение Polyspace

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

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

int val;
int val=1;

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

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

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

  • Запрещено несколько определений для функции function_name.

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

  • Глобальная переменная variable_name умножение определено.

  • Функция function_name умножение определено.

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

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

Поиск неисправностей

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

Примеры

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

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

/* file1.c */
extern int var = 1;

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

/* file2.c */
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 квалификатор, функции имеют внешнюю связь.

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

Группа: Объявления и определения
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b