Megosztás:


Figyelmeztetés C26472

Ne használjon static_cast aritmetikai konverziókhoz. Használjon kapcsos inicializálást vagy gsl::narrow_castgsl::narrow.

C++ alapvető irányelvek: Type.1: A leadások elkerülése

Ez a szabály segít megtalálni azokat a helyeket, ahol statikus öntötteket használnak az integráltípusok közötti konvertáláshoz. Ezek a leadások nem biztonságosak, mert a fordító nem figyelmeztet, ha adatvesztés történik. A kapcsos inicializálók jobbak azokban az esetekben, amikor állandókat használnak, és fordítóhiba szükséges. Az irányelvek támogatási kódtára olyan segédprogramokat is tartalmaz, amelyek segítenek a szándékok egyértelmű leírásában:

  • gsl::narrow biztosítja a veszteségmentes konverziót, és dob, gsl::narrowing_error ha ez nem lehetséges.
  • gsl::narrow_cast egyértelműen kimondja, hogy az átalakítás adatvesztést okozhat, és elfogadható.

Megjegyzések

  • Ez a szabály csak statikus leadásokhoz van implementálva. A C stílusú öntöttek használata nem ajánlott.

Kódelemzés neve: NO_CASTS_FOR_ARITHMETIC_CONVERSION.

példa

Nem kezelt váratlan adatok:

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

Nem kezelt váratlan adatok, biztonságosabb verzió:

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