C26117
Warnung C26117: Freigeben von unheld Sperre <lock> in der Funktion <func>.
Erzwingen der syntaktisch bewerteten Sperre rufen ab und sperren Versionspaare in C/C++-Programmen ausgeführt wird nicht durch die Sprache.Eine Funktion ist möglicherweise ein Sperrennebeneffekt vor, indem eine erkennbare Änderung des Parallelitätszustand macht.Beispielsweise erhöht eine Sperrenwrapperfunktion die Anzahl der Sperrendatenerfassungen oder Sperrenanzahl, für eine angegebene Sperre. Sie können eine Funktion bzw. kommentieren, die einen Nebeneffekt von einer Sperre Version abrufen oder sperren es Ihnen ermöglicht, _Acquires_lock_ oder _Releases_lock_ verwendet.Ohne diese Anmerkungen kann eine Funktion, um erwartet keine Sperrenanzahl zu ändern, nachdem sie zurückgibt.Wenn abgerufen und Versionen nicht ausgeglichen werden, werden sie als verwaist betrachtet.C26117 Warnung wird ausgegeben, wenn eine Funktion, die nicht mit _Releases_lock_ gekennzeichnet wurde, eine Sperre freigibt, die nicht enthält, da die Funktion die Sperre besitzen muss, bevor sie es freigibt.
Beispiel
Im folgenden Beispiel wird die Warnung C26117, da die Funktion ReleaseUnheldLock eine Sperre freigibt, die sie nicht notwendigerweise HOLD--dzustand von flag ist dies mehrdeutig- und keine Anmerkung gibt, die angibt, dass sie sollte.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
Im folgenden Code wird das Problem behoben, indem er sicherstellt, dass die freigegebene Sperre auch unter denselben Bedingungen abgerufen wird.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
{
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
}