MISRA C:2012 Rule 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 спецификатор, функции имеют внешнее рычажное устройство.

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

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