MISRA C:2012 Rule 8.8

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

Описание

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

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

Объяснение

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

В этой ситуации редактирование выполняется в соответствии с предыдущими спецификациями, которые являются видимыми (C99 Standard, раздел 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