Partilhar via


C26135

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

Aviso que c26135 é emitido quando o analisador infere que uma função é uma função de invólucro de bloqueio tem um bloqueio de adquirir ou efeito colateral de liberação de bloqueio.Se o código não se destina a ser uma função de invólucro, o bloqueio está vazando (se o bloqueio está sendo adquirido) ou ele está sendo lançado incorretamente (se o bloqueio está sendo lançado).

Exemplo

O exemplo a seguir gera aviso C26135 porque está falta uma anotação de efeito colateral apropriado.

    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 também é emitido quando um efeito colateral bloqueio condicional é detectado.Para anotar um efeito condicional, use o _When_(ConditionExpr, LockAnnotation) anotação, onde LockAnnotation é _Acquires_lock_ ou _Releases_lock_ e a expressão de predicado ConditionExpr é uma expressão booleana condicional.Os efeitos colaterais de outras anotações na mesma função só ocorrem quando ConditionExpr for avaliada como true.Porque ConditionExpr é usado para retransmitir a condição de volta para o chamador, ele deve envolver variáveis que são reconhecidas no contexto de chamada.Eles incluem parâmetros de função globais ou variáveis de membro de classe ou o valor de retorno.Para ver o retorno de valor, 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;
    }

Bloqueios compartilhados/exclusivo, também conhecido como bloqueios de leitor/gravador, você pode expressar efeitos colaterais bloqueio usando as seguintes anotações:

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)