Upozornění C26473
Nepřetypovávejte mezi typy ukazatelů, kde je typ zdroje a cílový typ stejné.
C++ Core Guidelines: Type.1: Vyhněte se přetypování
Toto pravidlo pomáhá odebrat nepotřebné nebo podezřelé přetypování. Samozřejmě, když je typ převeden na sebe, takový převod je neefektivní. Skutečnost, že se přetypování používá, může znamenat malý problém návrhu nebo potenciál regrese, pokud se typy v budoucnu změní. Vždy je bezpečnější používat co nejvíce přetypování.
Poznámky
- Toto pravidlo se implementuje pro statické přetypování a reinterpretuje přetypování a kontroluje pouze typy ukazatelů.
Příklad
nebezpečné obecné vyhledávání
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);
}
nebezpečné obecné vyhledávání – přepracováno
// ...
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;
}
// ...