Предупреждение C26117

Освобождение неопубликованной блокировки "lock" в функции "func".

Принудительное применение синтаксически область заблокированных пар получения и блокировки в программах C/C++ не выполняется языком. Функция может ввести побочный эффект блокировки, сделав наблюдаемое изменение состояния параллелизма. Например, функция-оболочка блокировки увеличивает количество приобретений блокировки или число блокировок для заданной блокировки. Вы можете зафиксировать функцию, которая имеет побочный эффект от блокировки получения или блокировки выпуска с помощью _Acquires_lock_ или _Releases_lock_соответственно. Без таких заметок функция, как ожидается, не измените количество блокировок после возврата. Если приобретение и выпуски не сбалансированы, они считаются потерянными. Предупреждение C26117 выдается, когда функция, которая не была помечена как _Releases_lock_ блокировка, которая не удерживается, так как функция должна принадлежать блокировке перед ее выпуском.

Примеры

В следующем примере создается предупреждение C26117, так как функция ReleaseUnheldLock освобождает блокировку, которая не обязательно удерживает (состояние flag неоднозначности) и не содержит заметки, указывающие, что она должна быть.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
        EnterCriticalSection(&p->cs);
    // code ...
    LeaveCriticalSection(&p->cs);
}

Следующий код устраняет проблему, гарантируя, что освобожденная блокировка также приобретается в том же состоянии.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

int flag;

void ReleaseUnheldLock(DATA* p)
{
    if (flag)
    {
        EnterCriticalSection(&p->cs);
        // code ...
        LeaveCriticalSection(&p->cs);
    }
}

См. также