Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Анализатор обнаружил опасное приведение числа к перечислению. Указанное число может не входит в диапазон значений enum.
Пример:
enum TestEnum { A, B, C };
TestEnum Invalid = (TestEnum)42;
Так как стандарт не указывает базовый тип для enum, то результат приведения числа, чьё значение не входит диапазон элементов enum, является unspecified behavior до C++17 и undefined behavior начиная с C++17.
Для того чтобы этого избежать, необходимо проверять числа перед приведениями. Как вариант, можно явно указать базовый тип для enum или использовать 'enum class', базовый тип которого по умолчанию - 'int'.
Корректный код:
enum TestEnum { A, B, C, Invalid = 42 };
Или:
enum TestEnum : int { A, B, C };
E Invalid = (E)42;
Или:
enum class TestEnum { A, B, C };
TestEnum Invalid = (TestEnum)42;
Данная диагностика классифицируется как:
|