Condividi tramite


Avviso C26472

Non usare un static_cast per le conversioni aritmetiche. Usare l'inizializzazione tra parentesi graffe, gsl::narrow_casto gsl::narrow.

Linee guida di base di C++: Type.1: Evitare i cast

Questa regola consente di trovare posizioni in cui vengono usati cast statici per eseguire la conversione tra tipi integrali. Questi cast non sono sicuri perché il compilatore non avvisa se si verifica una perdita di dati. Gli inizializzatori di parentesi graffe sono migliori per i casi in cui vengono usate le costanti e si desidera un errore del compilatore. Ci sono anche utilità della libreria di supporto linee guida che consentono di descrivere chiaramente le intenzioni:

  • gsl::narrow garantisce la conversione senza perdita e genera gsl::narrowing_error un'eccezione se non è possibile.
  • gsl::narrow_cast chiaramente indica che la conversione può perdere dati ed è accettabile.

Osservazioni:

  • Questa regola viene implementata solo per i cast statici. L'uso di cast in stile C è sconsigliato.

Nome dell'analisi del codice: NO_CASTS_FOR_ARITHMETIC_CONVERSION

Esempio

Dati imprevisti non gestiti:

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

Dati imprevisti non gestiti, versione più sicura:

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