Compartir vía


Advertencia C26472

No use un static_cast para conversiones aritméticas. Use la inicialización de llaves, gsl::narrow_casto gsl::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 inicia gsl::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)
    };
}