Advertencia C26473
No convertir entre tipos de puntero donde el tipo de origen y el tipo de destino sean iguales.
C++ Core Guidelines: Type.1: Evitar conversiones
Esta regla ayuda a quitar conversiones innecesarias o sospechosas. Obviamente, cuando un tipo se convierte a sí mismo, esta conversión no es eficaz. Sin embargo, el hecho de que se use la conversión puede indicar un problema de diseño sutil o una posibilidad de regresión si los tipos cambian en el futuro. Siempre es más seguro usar tantas conversiones como sea posible.
Comentarios
- Esta regla se implementa para conversiones estáticas y conversiones de reinterpretación, y comprueba solo los tipos de puntero.
Ejemplo
búsqueda genérica peligrosa
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);
}
búsqueda genérica peligrosa (rehecha)
// ...
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;
}
// ...