Warnung C26117
Aufheben der Sperre "Sperren" in Funktion "func".
Die Erzwingung syntaktisch beschränkter Sperrsperren, die Veröffentlichungspaare in C/C++-Programmen abrufen und sperren, wird von der Sprache nicht ausgeführt. Eine Funktion kann einen Sperr-Nebeneffekt verursachen, indem eine feststellbare Änderung am Parallelitätszustand vorgenommen wird. Beispielsweise erhöht eine Sperrwrapperfunktion die Anzahl der Sperreskäufe oder die Anzahl der Sperren für eine bestimmte Sperre. Sie können eine Funktion kommentieren, die einen Nebeneffekt von einer Sperre hat, indem Sie die Sperre abrufen _Acquires_lock_
oder freigeben._Releases_lock_
Ohne solche Anmerkungen wird erwartet, dass eine Funktion nach der Rückgabe keine Sperranzahl mehr ändert. Wenn Erwerbe und Veröffentlichungen nicht ausgeglichen sind, gelten sie als verwaist. Warnung C26117 wird ausgegeben, wenn eine Funktion, die nicht mit _Releases_lock_
Anmerkungen versehen wurde, eine Sperre freigibt, die sie nicht enthält, da die Funktion die Sperre besitzen muss, bevor sie loslässt.
Beispiele
Im folgenden Beispiel wird die Warnung C26117 generiert, da die Funktion ReleaseUnheldLock
eine Sperre freigibt, die nicht unbedingt gehalten wird – der Zustand ist flag
mehrdeutig – und es gibt keine Anmerkung, die angibt, dass sie vorhanden ist.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
Der folgende Code behebt das Problem, indem sichergestellt wird, dass die freigegebene Sperre auch unter denselben Bedingungen erworben wird.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
{
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
}