Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Não use um static_cast para conversões aritméticas. Use a inicialização da chave,
gsl::narrow_castougsl::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::narrowgarante uma conversão sem perdas e lançagsl::narrowing_errorse não for possível. -
gsl::narrow_castafirma 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)
};
}