Partager via


Avertissement C26472

N’utilisez pas de static_cast pour les conversions arithmétiques. Utilisez l’initialisation de l’accolade, gsl::narrow_castou gsl::narrow.

Instructions principales C++ : Type.1 : Éviter les casts

Cette règle permet de trouver des emplacements où les casts statiques sont utilisés pour convertir entre les types intégraux. Ces casts sont dangereux, car le compilateur n’avertit pas si une perte de données se produit. Les initialiseurs d’accolades sont préférables pour les cas où les constantes sont utilisées, et une erreur du compilateur est souhaitée. Il existe également des utilitaires de la bibliothèque de support guidelines qui aident à décrire clairement les intentions :

  • gsl::narrow garantit la conversion sans perte et lève si gsl::narrowing_error ce n’est pas possible.
  • gsl::narrow_cast indique clairement que la conversion peut perdre des données et qu’elle est acceptable.

Notes

  • Cette règle est implémentée uniquement pour les casts statiques. L’utilisation de casts de style C est déconseillée.

Nom de l’analyse du code : NO_CASTS_FOR_ARITHMETIC_CONVERSION

Exemple

Données inattendues non gérées :

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
    };
}

Données inattendues non gérées, version plus sûre :

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)
    };
}