Oharra
Orrialde honetara sartzeak baimena behar du. Saioa hasteko edo direktorioak aldatzen saia zaitezke.
Orrialde honetara sartzeak baimena behar du. Direktorioak aldatzen saia zaitezke.
No use un static_cast para conversiones aritméticas. Use la inicialización de llaves,
gsl::narrow_castogsl::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::narrowgarantiza la conversión sin pérdida e iniciagsl::narrowing_errorsi no es posible. -
gsl::narrow_castindica 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 de 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)
};
}