MISRA C:2012 Rule 8.6

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

Описание

Эта проверка деактивирована в Polyspace по умолчанию® по мере анализа You Code. Смотрите Checkers Deactivated in Polyspace как You Code Default Analysis (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 qualifier, переменные имеют внешнее редактирование.

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

/* 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 qualifier, функции имеют внешнее редактирование.

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

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