Avertissement C26135

Annotation manquante 'annotation' à la fonction 'func'.

Avertissement C26135 est émis lorsque l’analyseur déduit qu’une fonction est une fonction wrapper de verrou qui a un effet secondaire « lock acquire » ou « lock release ». Si le code n’est pas destiné à être une fonction wrapper, le verrou fuite (s’il est acquis) ou est libéré de manière incorrecte (si le verrou est libéré).

Exemples

L’exemple suivant génère un avertissement C26135, car une annotation d’effet secondaire appropriée est manquante.

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

Avertissement C26135 est également émis lorsqu’un effet secondaire de verrouillage conditionnel est détecté. Pour annoter un effet conditionnel, utilisez l’annotation _When_(ConditionExpr, LockAnnotation) , où LockAnnotation se trouve _Acquires_lock_ ou _Releases_lock_ l’expression ConditionExpr de prédicat est une expression conditionnelle booléenne. Les effets secondaires d’autres annotations sur la même fonction se produisent uniquement lorsqu’elles ConditionExpr sont évaluées à true. Étant donné qu’elle ConditionExpr est utilisée pour relayer la condition à l’appelant, elle doit impliquer des variables reconnues dans le contexte appelant. Il s’agit notamment des paramètres de fonction, des variables membres globales ou de classe, ou la valeur de retour. Pour afficher la valeur de retour, utilisez une mot clé spéciale dans l’annotation, returncomme illustré dans l’exemple suivant.

 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/exclusifs, également appelés verrous lecteur/enregistreur, vous pouvez exprimer des effets secondaires de verrouillage à l’aide des annotations suivantes :

  • _Acquires_shared_lock_(LockExpr)

  • _Releases_shared_lock_(LockExpr)

  • _Acquires_exclusive_lock_(LockExpr)

  • _Releases_exclusive_lock_(LockExpr)