CERT C: Rule DCL37-C

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

Описание

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

Не объявляйте или задавайте зарезервированный identifier.[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 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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