MISRA C:2012 Rule 8.8

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

Описание

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

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

Объяснение

Если вы не используете 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(int);  /* Compliant - declaration: internal linkage */
extern int ggg(int x){  /* Non-compliant */
  return 1 + x;
}

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

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

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