Aviso C26472

Não use um static_cast para conversões aritméticas. Use a inicialização de chaves, gsl::narrow_castou gsl::narrow.

Diretrizes Principais do C++: Type.1: Evitar conversões

Essa regra ajuda a localizar locais em que as conversões estáticas são usadas para converter entre tipos integrais. Esses casts não são seguros porque o compilador não avisaria se ocorrer alguma perda de dados. Inicializadores de chaves são melhores nos casos em que constantes são usadas e quando espera-se um erro do compilador. Também há utilitários da Biblioteca de Suporte de Diretrizes que ajudam a descrever claramente as intenções:

  • gsl::narrow garante a conversão sem perdas e gerará gsl::narrowing_error se não for possível.
  • gsl::narrow_cast afirma claramente que a conversão pode perder dados e isso é aceitável.

Comentários

  • Essa regra é implementada apenas em conversões estáticas. O uso de moldes no estilo C é desencorajado.

Nome da análise de código: NO_CASTS_FOR_ARITHMETIC_CONVERSION

Exemplo

Dados inesperados não tratados:

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
    };
}

Dados inesperados não tratados, versão mais segura:

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)
    };
}