Upozornění C26472
Nepoužívejte static_cast pro aritmetické převody. Použití inicializace závorek,
gsl::narrow_cast
nebogsl::narrow
.
C++ Core Guidelines: Type.1: Vyhněte se přetypování
Toto pravidlo pomáhá najít místa, kde se statické přetypování používají k převodu mezi integrálními typy. Tato přetypování jsou nebezpečná, protože kompilátor by nevaroval, pokud dojde ke ztrátě dat. Inicializátory závorek jsou lepší pro případy, kdy se používají konstanty, a je žádoucí chyba kompilátoru. K dispozici jsou také nástroje z knihovny podpory pokynů, které pomáhají jasně popsat záměry:
gsl::narrow
zajišťuje bezeztrátový převod a vyvolágsl::narrowing_error
, pokud to není možné.gsl::narrow_cast
jasně uvádí, že převod může ztratit data a je přijatelný.
Poznámky
- Toto pravidlo se implementuje pouze pro statické přetypování. Použití přetypování ve stylu jazyka C se nedoporučuje.
Název analýzy kódu: NO_CASTS_FOR_ARITHMETIC_CONVERSION
Příklad
Neošetřená neočekávaná data:
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
};
}
Neošetřená neočekávaná data, bezpečnější verze:
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)
};
}