CERT C: Rule DCL37-C

Не объявляйте и не определяйте зарезервированный идентификатор

Описание

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

Не объявляйте и не определяйте зарезервированный идентификатор.[1]

Реализация Polyspace

Эта проверка проверяет на наличие следующих проблем:

  • Определение и неопределение зарезервированных идентификаторов или макросов.

  • Объявление зарезервированного идентификатора или имени макроса.

Примеры

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

Проблема

Проблема возникает при использовании #define и #undef зарезервированный идентификатор или зарезервированное имя макроса.

Риск

Зарезервированные идентификаторы и имена зарезервированных макросов предназначены для использования реализацией. Удаление или изменение значения зарезервированного макроса может привести к неопределенному поведению. Это правило применимо к следующему:

  • Идентификаторы или имена макросов, начинающиеся с подчеркивания

  • Идентификаторы в области файлов, описанные в стандартной библиотеке C (ISO®/ IEC 9899:1999, раздел 7, «Библиотека»)

  • Имена макросов, описанные в стандартной библиотеке C, определяются в стандартном заголовке (ISO/IEC 9899:1999, раздел 7, «Библиотека»).

Пример - Определение или неопределение зарезервированных идентификаторов
#undef __LINE__               /* Non-compliant - begins with _ */
#define _Guard_H 1            /* Non-compliant - begins with _ */
#undef _ BUILTIN_sqrt        /* Non-compliant - implementation may
                               * use _BUILTIN_sqrt for other purposes,
                               * e.g. generating a sqrt instruction */
#define defined               /* Non-compliant - reserved identifier */
#define errno my_errno        /* Non-compliant - library identifier */
#define isneg(x) ( (x) < 0 )  /* Compliant - rule doesn't include  
                               * future library directions   */
Проблема

Проблема возникает при объявлении зарезервированного идентификатора или имени макроса.

Если вы задаете имя макроса, которое соответствует стандартному библиотечному макросу, объекту или функции, Polyspace® считает это нарушением правила.

Правило рассматривает предварительные определения как определения.

Риск

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

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

Группа: Правило 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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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