C26117
Предупреждение C26117: Освобождение неудерживаемой блокировки <блокировка> в функции <функция>.
Синтаксическое выделение области блокировки между парными acquire и release в программах 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);
}
}