Warnung C26441

Guard-Objekte müssen benannt werden (cp.44)

C++ Core Guidelines

CP.44: Denken Sie daran, Ihre lock_guards und unique_locks zu benennen

Hinweise

Die Standardbibliothek stellt Sperren bereit, um gleichzeitigen Zugriff auf Ressourcen während ihrer Lebensdauer zu steuern. Wenn Sie ein Sperrobjekt ohne Namen deklarieren, erstellt der Compiler ein temporäres Objekt, das sofort destruktiert wird, anstatt eines Objekts, das am Ende des eingeschlossenen Bereichs lebt. Das Zuweisen eines Sperrobjekts zu einer Variablen ist also ein Fehler, der den Sperrmechanismus effektiv deaktiviert (da temporäre Variablen vorübergehend sind). Diese Regel fängt einfache Fälle eines solchen unbeabsichtigten Verhaltens auf.

Diese Diagnose analysiert nur die Standardsperrtypen std::scoped_lock, und std::unique_lockstd::lock_guard. Warnung C26444 deckt andere unbenannte RAII-Typen ab.

Die Analyse analysiert nur einfache Aufrufe von Konstruktoren. Komplexere Initialisierungsausdrücke können zu ungenauen Ergebnissen in Form von verpassten Warnungen führen. Die Analyse ignoriert Sperren, die als Argumente für Funktionsaufrufe übergeben oder von Funktionsaufrufen zurückgegeben werden. Es kann nicht ermittelt werden, ob diese Sperren absichtlich versuchen, diesen Funktionsaufruf zu schützen oder ob die Lebensdauer verlängert werden soll. Um einen ähnlichen Schutz für Typen bereitzustellen, die von einem Funktionsaufruf zurückgegeben werden, kommentieren Sie sie mit [[nodiscard]]. Sie können Konstruktoren auch kommentieren, [[nodiscard]] um nicht benannte Objekte dieses Typs zu vermeiden:

struct X { [[nodiscard]] X(); };

void f() {
    X{}; // warning C4834
}

Der Analyzer ignoriert Sperren, die als Temporärdateien erstellt wurden, aber benannten Verweisen zugewiesen wurden, um ihre Lebensdauer zu verlängern.

Codeanalysename: NO_UNNAMED_GUARDS

Beispiel

In diesem Beispiel fehlt der Name der bereichsbezogenen Sperre.

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex>{ diagnostic_mutex_ }; // C26441
        write_line(stream, text);
    }
}

Um den Fehler zu beheben, geben Sie der Sperre einen Namen, der die Lebensdauer erweitert.

void print_diagnostic(std::string_view text)
{
    auto stream = get_diagnostic_stream();
    if (stream)
    {
        std::lock_guard<std::mutex> lock{ diagnostic_mutex_ };
        write_line(stream, text);
    }
}

Siehe auch

C26444