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;
}
// ...
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla