exponenta event banner

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

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

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