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