Partilhar via


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

Consulte também

Referência

C26115