Compartilhar via


C26135

Aviso C26135: Anotação ausente <anotação> na função <func>.

C26135 de aviso é emitido quando o analisador infere que uma função é uma função de wrapper de bloqueio que tem um bloqueio adquirir ou bloquear o efeito colateral de versão.Se o código não deve ser uma função de wrapper, então ou o bloqueio está substituição (se o bloqueio está sendo adquirido) ou está sendo liberado incorretamente (se o bloqueio está sendo liberado).

Exemplo

O exemplo a seguir gerenciar C26135 de aviso como uma anotação apropriado do efeito colateral está ausente.

    typedef struct _DATA 
    {
        CRITICAL_SECTION cs;
    } DATA;

    void MyEnter(DATA* p) 
    {
        // Warning C26135:
        // Missing side effect annotation _Acquires_lock_(&p->cs)
        EnterCriticalSection(&p->cs);
    }

    void MyLeave(DATA* p) 
    {
        // warning C26135:
        // Missing side effect annotation _Releases_lock_(&p->cs)
        LeaveCriticalSection(&p->cs);
    }

C26135 de aviso é emitido quando um efeito colateral condicional de bloqueio é detectado.Para anotar um efeito condicional, use a anotação de _When_(ConditionExpr, LockAnnotation) , onde é LockAnnotation ou _Acquires_lock_ ou _Releases_lock_ e a expressão de predicado ConditionExpr é uma expressão condicional booliano.Os efeitos colaterais de outras anotações na mesma função só acontecem quando ConditionExpr avalia para retificar.Como ConditionExpr é usado para retransmitir a condição de volta para o chamador, deve incluir as variáveis que são reconhecidos no contexto de chamada.Esses incluem os parâmetros de função, ou variáveis globais classificação do membro, ou o valor de retorno.Para ver o valor de retorno, use uma palavra-chave especial na anotação, return, conforme mostrado no exemplo a seguir.

    typedef struct _DATA 
    {
        CRITICAL_SECTION cs; 
        int state;
   } DATA;

    _When_(return != 0, _Acquires_lock_(p->cs))
    int TryEnter(DATA* p) 
    {
        if (p->state != 0) 
        {
            EnterCriticalSection(&p->cs);
            return p->state;
        }

        return 0;
    }

Para compartilhado/bloqueios exclusivos, também conhecido como o leitor/gravador bloqueie, você pode expressar efeitos colaterais de bloqueio usando as anotações a seguir:

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)