Sdílet prostřednictvím


Upozornění C26472

Nepoužívejte static_cast pro aritmetické převody. Použití inicializace závorek, gsl::narrow_castnebo gsl::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)
    };
}