Aracılığıyla paylaş


Uyarı C26473

Kaynak türü ve hedef türün aynı olduğu işaretçi türleri arasında geçiş yapmayın.

C++ Temel Yönergeleri: Type.1: Yayınlardan kaçının

Bu kural gereksiz veya şüpheli yayınları kaldırmaya yardımcı olur. Açıkçası, bir tür kendisine dönüştürüldüğünde, böyle bir dönüştürme etkisizdir. Ancak, atamanın kullanılması, küçük bir tasarım sorununa veya gelecekte türler değişirse regresyon potansiyeline işaret edebilir. Mümkün olduğunca az döküm kullanmak her zaman daha güvenlidir.

Açıklamalar

  • Bu kural statik atamalar ve yeniden yorum atamaları için uygulanır ve yalnızca işaretçi türlerini denetler.

Örnek

tehlikeli genel arama

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

tehlikeli genel arama - yeniden çalışıldı

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