C26117C26117
Предупреждение C26117: освобождение неудерживаемой блокировки <lock> в функции <func> .warning C26117: Releasing unheld lock <lock> in function <func>.
Применение пар блокировки с синтаксическим набором с областью действия и блокировки в программах C/C++ не выполняется языком.Enforcement of syntactically scoped lock acquire and lock release pairs in C/C++ programs is not performed by the language. Функция может вызвать побочный результат блокировки, делая наблюдаемое изменение в состоянии параллелизма.A function may introduce a locking side effect by making an observable modification to the concurrency state. Например, функция-оболочка блокировки увеличивает количество операций получения блокировки или число блокировок для данной блокировки. Можно добавить аннотацию к функции, которая имеет побочный результат из запроса блокировки или снятия блокировки с помощью _Acquires_lock_
или _Releases_lock_
соответственно.For example, a lock wrapper function increments the number of lock acquisitions, or lock count, for a given lock.You can annotate a function that has a side effect from a lock acquire or lock release by using _Acquires_lock_
or _Releases_lock_
, respectively. Без таких заметок функция должна не изменять счетчик блокировок после возврата.Without such annotations, a function is expected not to change any lock count after it returns. Если получение и выпуски не сбалансированы, они считаются потерянными.If acquires and releases are not balanced, they are considered to be orphaned. Предупреждение C26117 выдается, когда функция, не снабженная заметками, _Releases_lock_
освобождает блокировку, которая не удерживается, так как функция должна владеть блокировкой, прежде чем она будет освобождена.Warning C26117 is issued when a function that has not been annotated with _Releases_lock_
releases a lock that it doesn't hold, because the function must own the lock before it releases it.
ПримерыExamples
В следующем примере создается предупреждение C26117, так как функция ReleaseUnheldLock
освобождает блокировку, которая не обязательно удерживается — состояние flag
является неоднозначным, и нет аннотации, указывающей, что она должна.The following example generates warning C26117 because the function ReleaseUnheldLock
releases a lock that it doesn't necessarily hold—the state of flag
is ambiguous—and there is no annotation that specifies that it should.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
Следующий код устраняет проблему, гарантируя, что освобожденная Блокировка также будет получена в тех же условиях.The following code fixes the problem by guaranteeing that the released lock is also acquired under the same conditions.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
{
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
}