Warnung C26473
Wechseln Sie nicht zwischen Zeigertypen, bei denen der Quelltyp und der Zieltyp identisch sind.
C++-Kernrichtlinien: Type.1: Vermeiden von Umwandlungen
Diese Regel hilft, unnötige oder verdächtige Umwandlungen zu entfernen. Offensichtlich ist eine solche Konvertierung unwirksam, wenn ein Typ in sich konvertiert wird. Aber die Tatsache, dass die Umwandlung verwendet wird, kann auf ein subtiles Designproblem oder ein Potenzial für Regression hinweisen, wenn sich Typen in Zukunft ändern. Es ist immer sicherer, so wenige Casts wie möglich zu verwenden.
Hinweise
- Diese Regel wird für statische Umwandlungen und neu interpretierte Umwandlungen implementiert und überprüft nur Zeigertypen.
Beispiel
gefährlich generische Suche
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);
}
gefährlich generische Suche - überarbeitet
// ...
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;
}
// ...