Freigeben über


Warnung C26472

Verwenden Sie keine static_cast für arithmetische Konvertierungen. Verwenden Sie die Klammerninitialisierung, gsl::narrow_castoder gsl::narrow.

C++-Kernrichtlinien: Type.1: Vermeiden von Umwandlungen

Mit dieser Regel können Sie Orte finden, an denen statische Umwandlungen verwendet werden, um zwischen integralen Typen zu konvertieren. Diese Umwandlungen sind unsicher, da der Compiler nicht gewarnt würde, wenn Datenverlust auftritt. Klammerninitialisierer sind besser für die Fälle, in denen Konstanten verwendet werden, und ein Compilerfehler ist erwünscht. Es gibt auch Hilfsprogramme aus der Richtlinien-Supportbibliothek, die helfen, Absichten klar zu beschreiben:

  • gsl::narrow stellt eine verlustlose Konvertierung sicher und löst sie aus gsl::narrowing_error , wenn dies nicht möglich ist.
  • gsl::narrow_cast stellt klar fest, dass die Konvertierung Daten verlieren kann und es akzeptabel ist.

Hinweise

  • Diese Regel wird nur für statische Umwandlungen implementiert. Die Verwendung von C-Format-Umwandlungen wird abgeraten.

Codeanalysename: NO_CASTS_FOR_ARITHMETIC_CONVERSION

Beispiel

Unbehandelte unerwartete Daten:

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

Unbehandelte unerwartete Daten, sicherere Version:

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