Udostępnij za pośrednictwem


Ostrzeżenie C26473

Nie rzutuj między typami wskaźników, w których typ źródłowy i typ docelowy są takie same.

Podstawowe wskazówki dotyczące języka C++: Type.1: Unikanie rzutowania

Ta reguła ułatwia usuwanie niepotrzebnych lub podejrzanych rzutów. Oczywiście, gdy typ jest konwertowany na siebie, taka konwersja jest nieskuteczna. Jednak fakt, że rzutowanie może wskazywać na subtelny problem projektowy lub potencjalny regresji, jeśli typy zmieniają się w przyszłości. Zawsze bezpieczniej jest używać jak najmniejszej liczby rzutów.

Uwagi

  • Ta reguła jest implementowana dla rzutów statycznych i rzutów reinterpretowanych oraz sprawdza tylko typy wskaźników.

Przykład

niebezpiecznie ogólne wyszukiwanie

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

niebezpiecznie ogólne wyszukiwanie — przerobione

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