C26117
Aviso C26117: Liberando bloqueio não mantido <lock> na função <fun>.
A imposição de bloqueio sintaticamente o escopo do adquire e os pares de versão de bloqueio em programas C/C++ não são executados pelo idioma.Uma função pode enviar um efeito colateral de bloqueio fazendo uma alteração perceptível ao estado de simultaneidade.Por exemplo, uma função de wrapper de bloqueio incrementa o número de aquisições de bloqueio, ou a contagem de bloqueio, para um bloqueio fornecido. É possível anotar uma função que tem um efeito colateral de adquirir um bloqueio ou bloquear a versão usando _Acquires_lock_ ou _Releases_lock_, respectivamente.Sem essas anotações, uma função é esperada não altere nenhuma contagem de bloqueio depois que ele retorna.Se o adquire e as versões não são equilibradas, será considerada órfãos.C26117 de aviso é emitido quando uma função que não seja anotadas com _Releases_lock_ libera um bloqueio que não sustente, como a função deverá ser proprietário do bloqueio antes que o libera.
Exemplo
O exemplo a seguir gerenciar C26117 de aviso como a função ReleaseUnheldLock libera um bloqueio que não faça necessariamente estado da propriedade - flag é ambíguo- e não há nenhuma anotação que especifica se 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 garantir que o bloqueio adquirido também será liberado com 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);
}
}