exponenta event banner

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

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

Описание

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

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

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

Объяснение

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

Внедрение Polyspace

Флаги средства проверки правил:

  • Объекты, определенные в области файла без static спецификатор, но используется только в одном файле.

  • Функции, определенные без static спецификатор, но вызывается только в одном файле.

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

Если код не содержит main и вы используете такие опции, как Variables to initialize (-main-generator-writes-variables) со значением custom чтобы явно указать набор инициализируемых переменных, средство проверки не помечает эти переменные. Средство проверки предполагает, что в реальном приложении файл, содержащий main необходимо инициализировать переменные в дополнение к любому файлу, использующему их в данный момент. Поэтому переменные используются в нескольких единицах преобразования.

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

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

  • Переменная variable_name должны иметь внутреннюю связь.

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

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

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

Примеры

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

Файл заголовка:

/* file.h */
extern int var;

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

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

int var;    /* Compliant */
int var2;   /* Non compliant */
static int var3; /* Compliant */

void reset(void);

void reset(void) {
    var = 0;
    var2 = 0;
    var3 = 0;
}

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

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

void increment(int var2);

void increment(int var2) {
    var++;
    var2++;
}

В этом примере:

  • Объявление var соответствует, потому что var объявлен с внешней связью и используется в нескольких файлах.

  • Объявление var2 не соответствует, потому что var2 объявлен с внешней связью, но используется только в одном файле.

    Может показаться, что var2 определяется в обоих файлах. Однако во втором файле var2 является параметром без связи и не совпадает с параметром var2 в первом файле.

  • Объявление var3 соответствует, потому что var3 объявляется с внутренней связью (с static specifier) и используется только в одном файле.

Файл заголовка:

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

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

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

int var;

void increment2(void);
static void increment3(void);
void func(void);

void increment2(void) { /* Non compliant */
    var+=2;
}

static void increment3(void) { /* Compliant */
    var+=3;
}

void func(void) {
    increment1();
    increment2();
    increment3();
}

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

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

void increment1(void) { /* Compliant */
    var++;
}

В этом примере:

  • Определение increment1 соответствует, потому что increment1 определяется с помощью внешней связи и вызывается в другом файле.

  • Объявление increment2 не соответствует, потому что increment2 определяется внешней связью, но вызывается в том же файле и нигде.

  • Объявление increment3 соответствует, потому что increment3 определяется внутренней связью (с static specifier) и вызывается в том же файле и нигде.

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

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