C26117
C26117 de aviso: Liberando o bloqueio <lock> de unheld na função <func>.
A aplicação de bloqueio sintaticamente delimitado obtém e os pares de versão de bloqueio em programas de C/C++ não são executados pela linguagem.Uma função pode introduzir um efeito colateral de bloqueio fazer uma alteração perceptível o 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. Você poderá anotar uma função que tem um efeito colateral de um bloqueio adquirir ou bloquear a versão usando _Acquires_lock_ ou _Releases_lock_, respectivamente.Sem essas anotações, uma função é esperada não altere qualquer uma contagem de bloqueio depois que retorna.Se o e as versões não são equilibrada, são consideradas como orfandades.C26117 de aviso é emitida quando uma função que não está anotada com _Releases_lock_ libera o bloqueio que não contém até, porque a função deve possuir o bloqueio antes que o libere.
Exemplo
O exemplo a seguir produz C26117 de aviso como a função ReleaseUnheldLock libera o bloqueio que não necessariamente faz estado da propriedade de flag - é ambíguo- e não haja nenhuma anotação que especifica o que 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 corrigir o problema garantindo que o bloqueio será liberado adquirido também sob as mesmas circunstâncias.
typedef struct _DATA
{
CRITICAL_SECTION cs;
} DATA;
int flag;
void ReleaseUnheldLock(DATA* p)
{
if (flag)
{
EnterCriticalSection(&p->cs);
// code ...
LeaveCriticalSection(&p->cs);
}
}