C26116

Ostrzeżenie C26116: niepowodzenie uzyskania lub wstrzymania 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 _Requires_lock_held.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 C26116 jest wydawane, gdy funkcja zostanie oznaczona _Acquires_lock_, ale nie nabywa blokady lub gdy funkcja jest oznaczona _Requires_lock_held i zwalnia blokadę.

Przykład

Poniższy przykład generuje ostrzeżenie C26116, ponieważ funkcja DoesNotLock została oznaczona _Acquires_lock_, ale go nie nabywa.Funkcja DoesNotHoldLock generuje ostrzeżenie, ponieważ jest oznaczona _Requires_lock_held i go nie przechowuje.

typedef struct _DATA 
{
    CRITICAL_SECTION cs;
} DATA;

_Acquires_lock_(p->cs) void DoesLock(DATA* p) 
{
    EnterCriticalSection(&p->cs); // OK
}

_Acquires_lock_(p->cs) void DoesNotLock(DATA* p) 
{
    // Warning C26116
}

_Requires_lock_held_(p->cs) void DoesNotHoldLock(DATA* p) 
{
    LeaveCriticalSection(&p->cs); // Warning C26116
}

Zobacz też

Informacje

C26115