Предупреждение C26472
Не используйте static_cast для арифметических преобразований. Инициализация фигурных скобок или
gsl::narrow_cast
gsl::narrow
.
Основные рекомендации по C++ : Type.1: избегайте приведения
Это правило помогает найти места, где статические приведения используются для преобразования между целочисленными типами. Эти приведения небезопасны, так как компилятор не будет предупреждать, если происходит потеря данных. Инициализаторы фигурных скобок лучше подходят для тех случаев, когда используются константы, а ошибка компилятора является требуемой. Также есть служебные программы из библиотеки поддержки рекомендаций, которые помогают четко описать намерения:
gsl::narrow
гарантирует, что преобразование без потери и вызываетсяgsl::narrowing_error
, если это невозможно.gsl::narrow_cast
ясно указывает, что преобразование может потерять данные и это приемлемо.
Замечания
- Это правило реализуется только для статических приведения. Использование приведения в стиле C не рекомендуется.
Имя анализа кода: NO_CASTS_FOR_ARITHMETIC_CONVERSION
Пример
Необработанные непредвиденные данные:
rgb from_24bit(std::uint32_t v) noexcept {
return {
static_cast<std::uint8_t>(v >> 16), // C26472, what if top byte is non-zero?
static_cast<std::uint8_t>((v >> 8) & 0xFF), // C26472
static_cast<std::uint8_t>(v & 0xFF) // C26472
};
}
Необработанные непредвиденные данные, безопасная версия:
rgb from_24bit(std::uint32_t v) noexcept {
return {
gsl::narrow<std::uint8_t>(v >> 16),
gsl::narrow_cast<std::uint8_t>((v >> 8) & 0xFF),
gsl::narrow_cast<std::uint8_t>(v & 0xFF)
};
}