Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Liberação de bloqueio não mantido 'lock' na função 'func'.
Observações
A imposição de pares de bloqueio bloqueio e desbloqueio com escopo sintático em programas C/C++ não é realizada 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 envoltória de bloqueio incrementa o número de aquisições de bloqueio, ou contagem de bloqueio, para um bloqueio específico. Você pode anotar uma função que tenha 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 modifique a contagem de bloqueios depois que ela retorna. Se as aquisições e lançamentos não estiverem equilibrados, são considerados órfãos. O aviso C26117 é emitido quando uma função que não foi anotada com _Releases_lock_ libera um bloqueio que não mantém, porque a função deve possuir o bloqueio antes de liberá-lo.
Examples
O exemplo a seguir gera 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 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 nas 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);
}
}