Warnung C26441
Guard-Objekte müssen benannt werden (cp.44)
C++ Core Guidelines
CP.44: Denken Sie daran, Ihre lock_guard
s und unique_lock
s 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_lock
std::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);
}
}