Warnung C26449

gsl::span oder std::string_view von einem temporären Erstellt wird ungültig, wenn der temporäre Wert ungültig ist (gsl.view)

C++ Core Guidelines: GSL.view: Views.

Spans und Ansichten sind bequeme und einfache Typen, mit denen Sie auf Speicherpuffer verweisen können. Sie müssen jedoch sorgfältig verwendet werden: Während ihre Schnittstelle ähnlich wie Standardcontainer aussieht, ähnelt ihr Verhalten eher dem Verhalten von Zeigern und Verweisen. Sie besitzen keine Eigenen und dürfen niemals aus temporären Puffern erstellt werden. Diese Überprüfung konzentriert sich auf Fälle, in denen Quelldaten temporär sind, während eine Spanne oder Ansicht nicht vorhanden ist. Diese Regel kann dazu beitragen, subtile, aber gefährliche Fehler zu vermeiden, die vorgenommen werden, wenn Legacycode modernisiert wird und Sichten überspannt oder verwendet. Es gibt eine weitere Überprüfung, die ein etwas anderes Szenario behandelt, bei dem Bezug auf Spanverweise verwendet werden: C26445 NO_SPAN_REF.

Erwägen Sie die Verwendung von C26815 und C26816. Diese Warnungen sind allgemeinere Versionen dieser Warnung.

Hinweise

  • Diese Regel warnt an Orten, an denen Konstruktoren für Spannen oder Ansichten aufgerufen werden, und der Quelldatenpuffer gehört zu einem temporären Objekt, das in derselben Anweisung erstellt wurde. Diese Überprüfung umfasst:

    • implizite Konvertierungen in Rückgabeanweisungen;
    • implizite Konvertierungen in ternären Operatoren;
    • explizite Konvertierungen in static_cast Ausdrücken;
    • Funktionsaufrufe, die Container nach Wert zurückgeben.
  • Temporaries, die für Funktionsaufrufargumente erstellt wurden, werden nicht gekennzeichnet. Es ist sicher, von solchen Temporärdateien zu übergeben, wenn Zielfunktionen keine Datenzeiger in externen Variablen aufbewahren.

  • Wenn Spannen oder Ansichten sich selbst temporär sind, überspringt die Regel sie.

  • Die Datenverfolgung in der Prüfung hat bestimmte Einschränkungen; Daher werden komplexe Szenarien, die mehrere oder verdeckte Neuzuweisungen umfassen, möglicherweise nicht behandelt.

Codeanalysename: NO_SPAN_FROM_TEMPORARY

Beispiel

Subtiler Unterschied bei Ergebnistypen:

// Returns a predefined collection. Keeps data alive.
gsl::span<const sequence_item> get_seed_sequence() noexcept;

// Returns a generated collection. Doesn't own new data.
std::vector<sequence_item> get_next_sequence(gsl::span<const sequence_item>);

void run_batch()
{
    auto sequence = get_seed_sequence();
    while (send(sequence))
    {
        sequence = get_next_sequence(sequence); // C26449
        // ...
    }
}

Um das Problem zu beheben, stellen Sie sicher, dass die Ansicht aus einem Objekt erstellt wird, das mindestens so lange wie die Ansicht selbst lebt. Manchmal kann eine Lösung durch Kopieren der Daten erreicht werden. Manchmal müssen einige APIs neu gestaltet werden, um einen Verweis auf ein Objekt freizugeben, das lang genug ist, anstatt eine temporäre Kopie zurückzugeben.

Siehe auch

C26815
C26816