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

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

Описание

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

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

Объяснение

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

В этой ситуации связь следует за более ранней спецификацией, которая видима (Стандарт C99, Раздел 6.2.2). Например, если более ранняя спецификация указывает на внутреннюю связь, объект имеет внутреннюю связь даже при том, что последняя спецификация указывает на внешнюю связь. Если вы заметите одну только последнюю спецификацию, вы можете ожидать в противном случае.

Реализация Polyspace

Средство проверки правила обнаруживает ситуации где:

  • Тот же объект объявляется многократно с различными спецификаторами устройства хранения данных.

  • Та же функция объявлена и задана с различными спецификаторами устройства хранения данных.

Обменивайтесь сообщениями в отчете

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

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

static int foo = 0;
extern int foo;         /* Non-compliant */

extern int hhh;
static int hhh;         /* Non-compliant */

В этом примере первая строка задает foo с внутренней связью. Первая строка совместима, потому что пример использует ключевое слово static. Вторая строка не использует static в объявлении, таким образом, объявление несовместимо. Для сравнения третья строка объявляет hhh с ключевым словом extern, создающим внешнюю связь. Четвертая строка объявляет hhh с внутренней связью, но это объявление конфликты с первым объявлением hhh.

Исправление — сопоставимый static и использование extern

Одно возможное исправление должно последовательно использовать static и extern:

static int foo = 0;
static int foo;

extern int hhh;
extern int hhh;
static int fee(void);  /* Compliant - declaration: internal linkage */
int fee(void){         /* Non-compliant */
  return 1;
}

static int ggg(void);  /* Compliant - declaration: internal linkage */
extern int ggg(void){  /* Non-compliant */
  return 1 + x;
}

Этот пример показывает два внутренних нарушения связи. Поскольку fee и ggg имеют внутреннюю связь, необходимо использовать спецификатор класса static, чтобы быть совместимыми с MISRA®.

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

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

Введенный в R2014b