Bagikan melalui


Peringatan C26472

Jangan gunakan static_cast untuk konversi aritmatika. Gunakan inisialisasi kurung kurawal, gsl::narrow_cast, atau gsl::narrow.

Pedoman Inti C++: Type.1: Hindari cast

Aturan ini membantu menemukan tempat di mana cast statis digunakan untuk mengonversi antara jenis integral. Pemeran ini tidak aman karena pengkompilasi tidak akan memperingatkan jika terjadi kehilangan data. Penginisialisasi kurung lebih baik untuk kasus di mana konstanta digunakan, dan kesalahan pengompilasi diinginkan. Ada juga utilitas dari Pustaka Dukungan Pedoman yang membantu menjelaskan niat dengan jelas:

  • gsl::narrow memastikan konversi tanpa kerugian dan melempar gsl::narrowing_error jika tidak memungkinkan.
  • gsl::narrow_cast dengan jelas menyatakan bahwa konversi dapat kehilangan data dan dapat diterima.

Keterangan

  • Aturan ini hanya diimplementasikan untuk cast statis. Penggunaan cast gaya C tidak disarankan.

Nama analisis kode: NO_CASTS_FOR_ARITHMETIC_CONVERSION

Contoh

Data tak tertangani tak terduga:

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

Data tak terduga yang tidak tertangani, versi yang lebih aman:

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