exponenta event banner

MISRA C:2012 Правило 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 ®.

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

Группа: Объявления и определения
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b