Advertencia C26135

Falta la anotación 'annotation' en la función 'func'.

Advertencia C26135 se emite cuando el analizador deduce que una función es una función contenedora de bloqueo que tiene un efecto secundario de "adquisición de bloqueo" o "liberación de bloqueo". Si el código no está pensado para ser una función contenedora, el bloqueo se está filtrando (si se adquiere) o se libera incorrectamente (si se libera el bloqueo).

Ejemplos

En el ejemplo siguiente se genera la advertencia C26135 porque falta una anotación de efecto secundario adecuada.

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 de bloqueo condicional. Para anotar un efecto condicional, use la anotación _When_(ConditionExpr, LockAnnotation), donde LockAnnotation es _Acquires_lock_ o _Releases_lock_ y la expresión de predicado ConditionExpr es una expresión condicional booleana. Los efectos secundarios de otras anotaciones en la misma función solo se producen cuando ConditionExpr se evalúa como true. Dado que ConditionExpr se usa para volver a retransmitir la condición al autor de la llamada, debe implicar variables que se reconocen en el contexto de llamada. Entre ellas se incluyen parámetros de función, variables miembro global o de clase, o el valor devuelto. Para ver el valor devuelto, use 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;
}

En el caso de los bloqueos compartidos o exclusivos, también conocidos como bloqueos de lector y escritor, 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)