CERT C: Rule DCL36-C

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

Описание

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

Не объявляйте идентификатор с конфликтным рычажным устройством classifications.[1]

Реализация Polyspace

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

Примеры

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

Проблема

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

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

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

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

Риск

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

В этой ситуации рычажное устройство следует более ранней спецификации, которая отображается (Стандарт C99, Раздел 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 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

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