Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Não use um static_cast para conversões aritméticas. Use a inicialização entre 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. Essas conversões não são seguras porque o compilador não avisaria se ocorresse 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::narrowgarante a conversão sem perdas e gerarágsl::narrowing_errorse não for possível. -
gsl::narrow_castafirma 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)
};
}