Aracılığıyla paylaş


Uyarı C26472

Aritmetik dönüştürmeler için static_cast kullanmayın. Ayraç başlatma, gsl::narrow_castveya gsl::narrowkullanı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şturur gsl::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)
    };
}