Partilhar via


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);
    }
}

Consulte também

Referência

C26115