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

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

Описание

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

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

Объяснение

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

Реализация Polyspace

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

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

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

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

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) и используется в одном файле только.

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

/* 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) и назван в том же файле и больше нигде.

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

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

Введенный в R2014b