CERT C: Rule DCL36-C

Не объявляйте идентификатор с конфликтующими классификациями редактирований

Описание

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

Не объявляйте идентификатор с конфликтующими классификациями редактирований.[1]

Реализация Polyspace

Эта проверка проверяет несогласованное использование статических и внешних данных в объявлениях объектов.

Примеры

расширить все

Проблема

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

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

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

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

Риск

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

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

Пример - Конфликт редактирований между объявлениями переменных
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;
}

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

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

Группа: Правило 02. Объявления и инициализация (DCL)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.