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