V2552. MISRA. Expressions with enum underlying type should have values corresponding to the enumerators of the enumeration.


Данное диагностическое правило основано на руководстве 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;

Найденные ошибки

Проверено проектов
355
Собрано ошибок
13 303

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;