Bagikan melalui


Peringatan C26473

Jangan transmisikan antara jenis penunjuk di mana jenis sumber dan jenis target sama.

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

Aturan ini membantu menghapus cast yang tidak perlu atau mencurigakan. Jelas, ketika jenis dikonversi ke dirinya sendiri, konversi seperti itu tidak efektif. Namun fakta bahwa pemeran digunakan dapat menunjukkan masalah desain yang halus atau potensi regresi jika jenis berubah di masa mendatang. Selalu lebih aman untuk menggunakan transmisi seserang mungkin.

Keterangan

  • Aturan ini diimplementasikan untuk cast statis dan reinterpret cast, dan hanya memeriksa jenis pointer.

Contoh

pencarian generik berbahaya

gsl::span<server> servers_;

template<class T>
server* resolve_server(T tag) noexcept {
    auto p = reinterpret_cast<server*>(tag); // C26473, also 26490 NO_REINTERPRET_CAST
    return p >= &(*servers_.begin()) && p < &(*servers_.end()) ? p : nullptr;
}

void promote(server *s, int index) noexcept {
    auto s0 = resolve_server(s);
    auto s1 = resolve_server(index);
   if (s0 && s1)
        std::swap(s0, s1);
}

pencarian generik berbahaya - dikerjakan ulang

// ...
server* resolve_server(server *p) noexcept {
    return p >= &(*servers_.begin()) && p < &(*servers_.end()) ? p : nullptr;
}

server* resolve_server(ptrdiff_t i) noexcept {
    return !servers_.empty() && i >= 0 && i < servers_.size() ? &servers_[i] : nullptr;
}
// ...