Uyarı C26472
Aritmetik dönüştürmeler için static_cast kullanmayın. Ayraç başlatma,
gsl::narrow_cast
veyagsl::narrow
kullanın.
C++ Temel Yönergeleri: Type.1: Yayınlardan kaçının
Bu kural, integral türleri arasında dönüştürme yapmak için statik atamaların kullanıldığı yerleri bulmaya yardımcı olur. Derleyici herhangi bir veri kaybı oluşursa uyarmayacağından bu tür atamalar güvenli değildir. Küme ayracı başlatıcıları, sabitlerin kullanıldığı ve derleyici hatasının istendiği durumlar için daha iyidir. Ayrıca Yönergeler Destek Kitaplığı'ndan amaçları net bir şekilde açıklamaya yardımcı olan yardımcı programlar da vardır:
gsl::narrow
kayıpsız dönüştürmeyi sağlar ve mümkün değilse oluştururgsl::narrowing_error
.gsl::narrow_cast
dönüştürmenin verileri kaybedebileceğini ve kabul edilebilir olduğunu açıkça belirtir.
Açıklamalar
- Bu kural yalnızca statik atamalar için uygulanır. C stili atamaların kullanılması önerilmez.
Kod analizi adı: NO_CASTS_FOR_ARITHMETIC_CONVERSION
Örnek
İşlenmeyen beklenmeyen veriler:
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
};
}
İşlenmeyen beklenmeyen veriler, daha güvenli sürüm:
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)
};
}