C26135C26135

avertissement C26135 : manquant annotation <annotation > à la fonction <func >.warning C26135: Missing annotation <annotation> at function <func>.

Avertissement que c26135 est émis lorsque l’analyseur déduit qu’une fonction est une fonction de wrapper de verrou qui détient un verrou d’acquérir ou de verrouiller l’effet de mise en production.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 le code n’est pas destiné à être une fonction wrapper, puis perd le verrou (si le verrou est acquis) ou elle est libérée de façon incorrecte (si le verrou est libéré).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).

ExempleExample

L’exemple suivant génère l’avertissement C26135, car une annotation effet approprié est manquante.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);
}

ExempleExample

Avertissement C26135 est également émis lorsqu’un effet secondaire de verrouillage conditionnel est détecté.Warning C26135 is also issued when a conditional locking side effect is detected. Pour annoter un effet conditionnel, vous devez utiliser le _When_(ConditionExpr, LockAnnotation) annotation, où LockAnnotation est _Acquires_lock_ ou _Releases_lock_ et l’expression de prédicat ConditionExpr est une expression conditionnelle booléenne.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. Les effets secondaires d’autres annotations sur la même fonction se produisent uniquement lorsque ConditionExpr a la valeur true.The side effects of other annotations on the same function only occur when ConditionExpr evaluates to true. Étant donné que ConditionExpr est utilisé pour la condition sur l’appelant, il doit impliquer des variables qui sont reconnus dans le contexte d’appel de relais.Because ConditionExpr is used to relay the condition back to the caller, it must involve variables that are recognized in the calling context. Notamment, les paramètres de fonction, globales ou de variables membres de classe ou de la valeur de retour.These include function parameters, global or class member variables, or the return value. Pour afficher la valeur de retour, utilisez un mot clé spéciale dans l’annotation, return, comme illustré dans l’exemple suivant.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;
 }

Pour les verrous partagés/exclusif, également connu sous les verrous de lecture/écriture, vous pouvez exprimer des effets secondaires du verrouillage à l’aide des annotations suivantes :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)