C26135C26135

Advertencia C26135: falta la anotación <anotación > en una función <func >.warning C26135: Missing annotation <annotation> at function <func>.

Advertencia que c26135 se emite cuando el analizador se deduce que una función es una función de contenedor de bloqueo que tiene un bloqueo de adquirir o bloquear el efecto secundario de versión.Warning C26135 is issued when the analyzer infers that a function is a lock wrapper function that has a lock acquire or lock release side effect. Si el código no está diseñado para ser una función de contenedor, pierde el bloqueo (si se ha adquirido el bloqueo), o bien se ha publicado correctamente (si se ha publicado el bloqueo).If the code is not intended to be a wrapper function, then either the lock is leaking (if the lock is being acquired) or it is being released incorrectly (if the lock is being released).

EjemploExample

El ejemplo siguiente genera la advertencia C26135 porque falta una anotación de efecto secundario adecuado.The following example generates warning C26135 because an appropriate side effect annotation is missing.


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

EjemploExample

También se emite la advertencia C26135 cuando se detecta un efecto secundario bloqueo condicional.Warning C26135 is also issued when a conditional locking side effect is detected. Para anotar un efecto condicional, use el _When_(ConditionExpr, LockAnnotation) anotación, donde LockAnnotation sea _Acquires_lock_ o _Releases_lock_ y la expresión de predicado ConditionExpr es una expresión booleana condicional.To annotate a conditional effect, use the _When_(ConditionExpr, LockAnnotation) annotation, where LockAnnotation is either _Acquires_lock_ or _Releases_lock_ and the predicate expression ConditionExpr is a Boolean conditional expression. Los efectos secundarios de otras anotaciones en la misma función solo se producen cuando ConditionExpr se evalúa como true.The side effects of other annotations on the same function only occur when ConditionExpr evaluates to true. Dado que ConditionExpr se utiliza para retransmitir la condición en el llamador, deben implicar las variables que se reconocen en el contexto de llamada.Because ConditionExpr is used to relay the condition back to the caller, it must involve variables that are recognized in the calling context. Estos incluyen parámetros de función, globales o variables de miembro de clase o el valor devuelto.These include function parameters, global or class member variables, or the return value. Para ver el valor devuelto de valor, utilice una palabra clave especial en la anotación, return, tal y como se muestra en el ejemplo siguiente.To see the return value, use a special keyword in the annotation, return, as shown in the following example.


 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 los bloqueos compartidos/exclusión, también conocido como bloqueos de lector/escritor, puede expresar efectos secundarios de bloqueos mediante el uso de las siguientes anotaciones:For shared/exclusive locks, also known as reader/writer locks, you can express locking side effects by using the following annotations:

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)