C26117
Ostrzeżenie C26117: zwolnienie niezałożonej blokady <lock> w funkcji <func>.
Wymuszenie syntaktycznie zakresu blokowania, para nabywania i zwalniania blokady w programach C/C++ nie jest wykonywane przez język.Funkcja może wprowadzić efekt uboczny blokowania poprzez dokonanie dostrzegalnych modyfikacji w stanie współbieżności.Na przykład funkcja otoki blokady zwiększa liczbę nabytych blokad, lub liczbę blokad, dla danej blokady. Można dodać adnotacje do funkcji, która ma efekt uboczny nabycia lub zwolnienia blokady, odpowiednio, za pomocą _Acquires_lock_ lub _Releases_lock_.Bez takich adnotacji oczekuje się, aby funkcja nie zmieniała żadnych liczników blokad po jej zakończeniu.Jeśli nabycia i zwolnienia nie są zrównoważone, należy rozważyć rozdzielenie.Ostrzeżenie C26117 jest nakładane, gdy funkcja, która nie została oznaczona przez _Releases_lock_, zwalnia blokadę, której nie przechowuje, ponieważ funkcja musi być właścicielem blokady, zanim ją zwolni.
Przykład
Poniższy przykład generuje ostrzeżenie C26117, ponieważ funkcja ReleaseUnheldLock zwalnia blokadę, której nie musi koniecznie przechowywać — stan flag jest niejednoznaczny — i nie ma adnotacji, która określa, że powinna.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
Poniższy kod rozwiązuje problem, gwarantując, że zwalniana blokada jest nabywana na tych samych warunkach.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
{
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
}