Bagikan melalui


Peringatan C26474

Jangan transmisikan di antara jenis penunjuk saat konversi bisa implisit.

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

Dalam beberapa kasus, transmisi implisit antara jenis pointer aman dan tidak mengharuskan Anda menulis ekspresi cast tertentu. Aturan ini menemukan instans cast yang tidak perlu yang dapat Anda hapus dengan aman.

Keterangan

ID aturan harus ditafsirkan sebagai "Pemeran implisit tidak digunakan jika dapat diterima."

Aturan ini hanya berlaku untuk penunjuk. Ini memeriksa cast statis dan menginterpretasikan ulang cast.

Kasus-kasus ini adalah konversi pointer yang dapat diterima yang seharusnya tidak menggunakan ekspresi cast eksplisit:

  • konversi ke nullptr_t;
  • konversi ke void*;
  • konversi dari jenis turunan ke dasarnya saat memanggil fungsi anggota dasar yang tidak disembunyikan oleh jenis turunan.

Contoh 1

Konversi yang tidak perlu menyembunyikan kesalahan logika dalam contoh ini:

template<class T>
bool register_buffer(T buffer) {
    auto p = reinterpret_cast<void*>(buffer); // C26474, also 26490 NO_REINTERPRET_CAST
    // To fix, declare buffer as T*, and use this to define p:
    // auto p = buffer;
    return buffers_.insert(p).second;
}

void merge_bytes(std::uint8_t *left, std::uint8_t *right)
{
    if (left && register_buffer(*left)) { // Unintended dereference!
        // ...
        if (right && register_buffer(right)) {
            // ...
        }
    }
}

Contoh 2

Contoh ini menunjukkan penggunaan cast untuk mengakses fungsi anggota kelas dasar:

struct struct_1
{
    void foo();
    void bar();
};

struct struct_2 : struct_1
{
    void foo(); // this definition hides struct_1::foo
};

void fn(struct_2* ps2)
{
    static_cast<struct_1*>(ps2)->foo(); // This cast is necessary to access struct_1::foo
                                        // Alternatively, use ps2->struct_1::foo();
    static_cast<struct_1*>(ps2)->bar(); // This cast is unnecessary and can be done implicitly
}