Aviso C26117
Liberando bloqueio não mantido 'lock' na função 'func'.
A imposição de pares de bloqueio com escopo sintaticamente adquirido e de liberação de bloqueio em programas C/C++ não é executada pela linguagem. Uma função pode introduzir um efeito colateral de bloqueio fazendo uma modificação observável no estado de simultaneidade. Por exemplo, uma função wrapper de bloqueio incrementa o número de aquisições de bloqueio, ou contagem de bloqueios, para um determinado bloqueio. Você pode anotar uma função que tem um efeito colateral de uma aquisição ou liberação de bloqueio usando _Acquires_lock_
ou _Releases_lock_
, respectivamente. Sem essas anotações, espera-se que uma função não altere nenhuma contagem de bloqueios após o retorno. Se as aquisições e lançamentos não forem equilibradas, elas são consideradas órfãs. O aviso C26117 é emitido quando uma função que não foi anotada libera _Releases_lock_
um bloqueio que não mantém, porque a função deve possuir o bloqueio antes de liberá-lo.
Exemplos
O exemplo a seguir gera o aviso C26117 porque a função ReleaseUnheldLock
libera um bloqueio que não necessariamente mantém — o estado de flag
é ambíguo — e não há nenhuma anotação que especifique que ela deve.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
O código a seguir corrige o problema garantindo que o bloqueio liberado também seja adquirido sob as mesmas condições.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
{
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
}