Share via


C26135

warning C26135: Annotazione mancante <annotation> alla funzione <func>.

L'avviso C26135 viene generato quando l'analizzatore deduce che una funzione è una funzione wrapper che ha l'effetto collaterale di ottenere un blocco o di rilasciare un blocco.Se il codice non deve essere una funzione wrapper, allora o il blocco viene perso (se il blocco viene acquisito) oppure viene rilasciato in modo errato (se il blocco viene rilasciato).

Esempio

Nell'esempio seguente viene generato l'avviso C26135 a causa di una mancante voce appropriata dell'effetto collaterale.

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

L'avviso C26135 viene generato anche quando viene rilevato un effetto collaterale di blocco condizionale.Per annotare un effetto condizionale, utilizzare l'annotazione _When_(ConditionExpr, LockAnnotation), in cui LockAnnotation è o _Acquires_lock_ o _Releases_lock_ e l'espressione di predicato ConditionExpr è un'espressione condizionale booleana.Gli effetti collaterali di altre annotazioni sulla stessa funzione si verificano solo quando ConditionExpr restituisce true.Poiché ConditionExpr viene utilizzato per fornire la condizione di ritorno al chiamante, deve includere variabili che vengono riconosciute nel contesto della chiamata.Questi comprendono i parametri della funzione, variabili membro della classe o globali, o il valore di ritorno.Per verificare il valore di ritorno, utilizzare una parola chiave speciale nell'annotazione, return, come illustrato nell'esempio seguente.

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

Per blocchi condivisi o esclusivi, noti anche come blocchi reader/writer, è possibile esprimere gli effetti collaterali del bloccaggio utilizzando le annotazioni seguenti:

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)