Warnung C26474

Wandeln Sie nicht zwischen Zeigertypen um, wenn die Konvertierung implizit sein könnte.

C++-Kernrichtlinien:
Type.1: Vermeiden von Umwandlungen

In einigen Fällen sind implizite Umwandlungen zwischen Zeigertypen sicher und erfordern nicht, dass Sie einen bestimmten Umwandlungsausdruck schreiben. Diese Regel findet Instanzen unnötiger Umwandlungen, die Sie sicher entfernen können.

Hinweise

Die Regel-ID sollte als "Implizite Umwandlung wird nicht verwendet, wo sie akzeptabel ist".

Diese Regel gilt nur für Zeiger. Es überprüft statische Umwandlungen und neu interpretierte Umwandlungen.

Diese Fälle sind akzeptable Zeigerkonvertierungen, die keine expliziten Umwandlungsausdrücke verwenden sollten:

  • Konvertierung in nullptr_t;
  • Konvertierung in void*;
  • Konvertierung von einem abgeleiteten Typ in die Basis, wenn eine Basiselementfunktion abgerufen wird, die nicht vom abgeleiteten Typ ausgeblendet ist.

Beispiel 1

Eine unnötige Konvertierung blendet einen Logikfehler in diesem Beispiel aus:

template<class T>
bool register_buffer(T buffer) {
    auto p = reinterpret_cast<void*>(buffer); // C26474, also 26490 NO_REINTERPRET_CAST
    // To fix, declare buffer as T*, and use this to define p:
    // auto p = buffer;
    return buffers_.insert(p).second;
}

void merge_bytes(std::uint8_t *left, std::uint8_t *right)
{
    if (left && register_buffer(*left)) { // Unintended dereference!
        // ...
        if (right && register_buffer(right)) {
            // ...
        }
    }
}

Beispiel 2

In diesem Beispiel wird die Verwendung von Umwandlungen für den Zugriff auf Memberfunktionen der Basisklasse veranschaulicht:

struct struct_1
{
    void foo();
    void bar();
};

struct struct_2 : struct_1
{
    void foo(); // this definition hides struct_1::foo
};

void fn(struct_2* ps2)
{
    static_cast<struct_1*>(ps2)->foo(); // This cast is necessary to access struct_1::foo
                                        // Alternatively, use ps2->struct_1::foo();
    static_cast<struct_1*>(ps2)->bar(); // This cast is unnecessary and can be done implicitly
}