Partilhar via


Aviso C26472

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

Diretrizes principais do C++: Tipo.1: Evitar transmissões

Esta regra ajuda a encontrar lugares onde moldes estáticos são usados para converter entre tipos integrais. Esses casts não são seguros porque o compilador não avisaria se ocorrer alguma perda de dados. Os inicializadores de chave são melhores para os casos em que as constantes são usadas, e um erro de compilador é desejado. Há também utilitários da Biblioteca de Suporte de Diretrizes que ajudam a descrever as intenções claramente:

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

Observações

  • Esta regra é implementada apenas para moldes estáticos. O uso de moldes 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)
    };
}