Sdílet prostřednictvím


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