CERT C++: DCL51-CPP

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

Описание

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

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

Реализация Polyspace

Эта проверка проверяет:

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

  • Пользовательский оператор литерала, не начинающийся с подчеркивания

Примеры

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

Проблема

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

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

Проблема

Эта проблема возникает, когда вы задаете операторов формы

operator "" suffix
где suffix не начинается с подчеркивания или после подчеркивания, содержит символы, отличные от букв (цифры, специальные символы и так далее).

Риск

Начиная с C++ 11, можно добавить суффиксы к литералам, которые преобразуют числовые значения под капотом. Например, в коде, где вы выполняете все вычисления в общем модуле, можно оставить преобразование модулей измерения в выделенные операторы и просто использовать буквальные суффиксы для модулей при определении постоянных значений.

В этом примере буквальные суффиксы _m и _km решает, чтобы вызовы к operator"" _m() и operator"" _km() соответственно. Операторы обеспечивают преобразование всех значений в один модуль.

constexpr long double operator"" _m(long double metres) {
    return metres;
}

constexpr long double operator"" _km(long double kilometres) {
    return 1000*kilometres;
}
...
long double minSteps = 100.0_m;
long double interCityDist = 100.0_km;

Определяемые пользователем буквальные суффиксы должны начинаться с подчеркивания (_). Буквальные суффиксы, не начинающиеся с подчеркивания, зарезервированы для стандартной библиотеки.

Зафиксировать

Убедитесь, что пользовательские операторы литералов начинаются с подчеркивания, за которым следуют только буквы.

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

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

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

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