C26135

Advertencia C26135: Falta la anotación <anotación> en la función <función>.

La advertencia C26135 se emite cuando el analizador deduce que una función es una función contenedora de bloqueo que tiene un bloqueo adquirido o un efecto secundario de bloqueo liberado.Si el código no pretende ser una función contenedora, entonces o el bloqueo se está escapando (si se está adquiriendo el bloqueo) o se está liberando incorrectamente (si se está liberando el bloqueo).

Ejemplo

El siguiente ejemplo genera una advertencia C26135 porque falta una anotación adecuada del efecto secundario.

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

La advertencia C26135 también se emite cuando se detecta un efecto secundario condicional de bloqueo.Para anotar un efecto condicional, use la anotación _When_(ConditionExpr, LockAnnotation), donde _Acquires_lock_ es también LockAnnotation o _Releases_lock_ y la expresión del predicado ConditionExpr es una expresión condicional booleana.Los efectos secundarios de otras anotaciones en la misma función sólo aparecen cuando ConditionExpr se evalúa como true.Dado que ConditionExpr se utiliza para transmitir la condición de nuevo al llamador, debe involucrar las variables que se reconocen en el contexto de llamada.Los parámetros incluyen funciones, variables globales o miembros de clase o el valor devuelto.Para ver el valor devuelto, utilice una palabra clave especial en la anotación, return, como se muestra en el ejemplo siguiente.

    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 bloqueos compartidos o exclusivos, también conocidos como bloqueos de lectura o escritura, puede expresar efectos secundarios de bloqueo mediante las anotaciones siguientes:

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)