Udostępnij za pośrednictwem


Ostrzeżenie C26117

Zwalnianie blokady bez blokady "lock" w funkcji "func".

Wymuszanie syntaktycznie zakresu nabycia i blokady par zwalniania w programach C/C++ nie jest wykonywane przez język. Funkcja może wprowadzić efekt uboczny blokowania, wprowadzając zauważalną modyfikację stanu współbieżności. Na przykład funkcja otoki blokady zwiększa liczbę przejęć blokad lub liczbę blokad dla danej blokady. Możesz dodać adnotację do funkcji, która ma efekt uboczny z blokady uzyskiwania lub zwalniania blokady przy użyciu _Acquires_lock_ lub _Releases_lock_, odpowiednio. Bez takich adnotacji funkcja nie powinna zmieniać liczby blokad po jej powrocie. Jeśli pozyskiwanie i wydania nie są zrównoważone, są uważane za oddzielone. Ostrzeżenie C26117 jest wystawiane, gdy funkcja, która nie została oznaczona adnotacją, _Releases_lock_ zwalnia blokadę, która nie jest przechowywana, ponieważ funkcja musi być właścicielem blokady przed jej wydaniem.

Przykłady

Poniższy przykład generuje ostrzeżenie C26117, ponieważ funkcja ReleaseUnheldLock zwalnia blokadę, która nie musi być przechowywana — 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 zwolniona blokada jest również uzyskiwana w 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);
    }
}

Zobacz też