Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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::narrowbiztosítja a veszteségmentes konverziót, és dob,gsl::narrowing_errorha ez nem lehetséges. -
gsl::narrow_castegyé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)
};
}