C26473 NO_IDENTITY_CASTC26473 NO_IDENTITY_CAST

« Ne pas cast entre types pointeur où le type source et le type de cible sont identiques. »"Don't cast between pointer types where the source type and the target type are the same."

Instructions de base C++: Type.1 : Évitez des conversionsC++ Core Guidelines: Type.1: Avoid casts

Cette règle permet de supprimer les conversions inutiles ou suspectes.This rule helps to remove unnecessary or suspicious casts. Évidemment, lorsque le type est converti en lui-même, cette conversion n’est pas effectif, mais le fait que le cast est utilisé peut indiquer un risque potentiel de régression ou de problème de conception subtiles si les types de changent dans les futures.Obviously, when type is converted to itself, such conversion is ineffective, yet the fact that the cast is used may indicate subtle design issue or a potential for regression if types change in future. Il est toujours plus sûr d’utiliser des casts aussi peu que possible.It is always safer to use as few casts as possible.

NotesRemarks

  • Cette règle est implémentée pour statique et effectue un cast de réinterprétation et vérifie uniquement les types de pointeur.This rule is implemented for static and reinterpret casts and checks only pointer types. ## ExempleExample recherche générique dangereusementdangerously generic lookup
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);
}

ExempleExample

recherche générique dangereusement - retravailléedangerously generic lookup - reworked

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