MISRA C:2012 Rule 8.7

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

Описание

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

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

Объяснение

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

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

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

/* 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: консультация

Введенный в R2014b