Partilhar via


Aviso C26473

Não transmita entre tipos de ponteiro em que o tipo de origem e o tipo de destino são os mesmos.

Diretrizes principais do C++: Tipo.1: Evitar transmissões

Esta regra ajuda a remover transmissões desnecessárias ou suspeitas. Obviamente, quando um tipo é convertido para si mesmo, tal conversão é ineficaz. No entanto, o fato de o elenco ser usado pode indicar um problema de design sutil ou um potencial de regressão se os tipos mudarem no futuro. É sempre mais seguro usar o menor número possível de moldes.

Observações

  • Esta regra é implementada para transmissões estáticas e reinterpretações e verifica apenas os tipos de ponteiro.

Exemplo

pesquisa perigosamente genérica

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

pesquisa perigosamente genérica - retrabalhada

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