Warnung C26437

Nicht segmentieren.

C++-Kernrichtlinien: ES.63: Kein Segment

Die Sprache erlaubt das Slicing und kann als Sonderfall einer gefährlichen impliziten Umwandlung betrachtet werden. Selbst wenn sie absichtlich durchgeführt wird und nicht zu sofortigen Problemen führt, wird es immer noch dringend abgeraten. Dadurch wird das Ändern von Code erschwert, indem zusätzliche Anforderungen für verwandte Datentypen erzwungen werden. Dies gilt insbesondere, wenn Typen polymorph sind oder ressourcenmanagement umfassen.

Hinweise

Diese Regel warnt nicht nur bei expliziten Zuordnungen, sondern auch beim impliziten Slicing. Implizites Slicing erfolgt, wenn ein Ergebnis von der aktuellen Funktion zurückgegeben wird oder wenn Daten an andere Funktionen übergeben werden.

Die Regel kennzeichnet auch Fälle, in denen eine Zuordnung keine echten Datenslicing umfasst (z. B. wenn Typen leer sind oder keine gefährlichen Datenmanipulationen vornehmen). Solche Warnungen sollten weiterhin behoben werden, um unerwünschte Regressionen zu verhindern, wenn sich Datentypen oder Verhaltensweisen in Zukunft ändern.

Beispiel

Im nächsten Codebeispiel wird gelesen id_ex, der Aufrufer der Funktion erhält jedoch nur ein Segment des Objekts:

struct id {
    int value;
};

struct id_ex : id {
    int extension;
};

bool read_id(stream &s, id &v) {
    id_ex tmp{};
    if (!s.read(tmp.value) || !s.read(tmp.extension))
        return false;

    v = tmp; // C26437
    return true;
}

Um das Problem zu beheben, aktualisieren Sie die Funktion so, dass die richtigen Typen verwendet werden:

// ...
bool read_id(stream &s, id_ex &v) {
// ...