Поделиться через


Предупреждение C26472

Не используйте static_cast для арифметических преобразований. Инициализация фигурных скобок или gsl::narrow_castgsl::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)
    };
}