Avviso C26472
Non usare un static_cast per le conversioni aritmetiche. Usare l'inizializzazione tra parentesi graffe,
gsl::narrow_cast
ogsl::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 generagsl::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)
};
}