exponenta event banner

CERT C: DCL36-C правил

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

Описание

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

Не объявляйте идентификатор с конфликтующими классификациями связей. [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 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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