Advertencia C26472
No use un static_cast para conversiones aritméticas. Use la inicialización de llaves,
gsl::narrow_cast
ogsl::narrow
.
C++ Core Guidelines: Type.1: Evitar conversiones
Esta regla ayuda a buscar lugares donde se usan conversiones estáticas para convertir entre tipos enteros. Estas conversiones no son seguras porque el compilador no advertiría si se produce alguna pérdida de datos. Los inicializadores de llave son mejores para los casos en los que se usan constantes y se desea un error del compilador. También hay utilidades de la Biblioteca de soporte técnico de Guidelines que permiten describir claramente las intenciones:
gsl::narrow
garantiza la conversión sin pérdida e iniciagsl::narrowing_error
si no es posible.gsl::narrow_cast
indica claramente que la conversión puede perder datos y es aceptable.
Comentarios
- Esta regla se implementa solo para conversiones estáticas. No se recomienda el uso de conversiones de estilo C.
Nombre del análisis de código: NO_CASTS_FOR_ARITHMETIC_CONVERSION
Ejemplo
Datos inesperados no controladas:
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
};
}
Datos inesperados no controladas, versión más 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)
};
}