Aviso C26117
Liberando o bloqueio não retido 'lock' na função 'func'.
A imposição de pares de bloqueio e liberação de bloqueio com escopo sintaticamente definido 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 as versões não forem equilibradas, elas serã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 é contido, pois 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 contém — o estado de flag
é ambíguo — e não há nenhuma anotação que especifique que deveria.
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);
}
}