Aviso C26472
Não use um static_cast para conversões aritméticas. Use a inicialização de chaves,
gsl::narrow_cast
ougsl::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)
};
}