Avertissement C26116

Échec de l’acquisition ou de la conservation du verrou 'lock' dans 'func'.

L’application des paires d’acquisitions et de mise en production de verrous de portée syntactique dans les programmes C/C++ n’est pas effectuée par le langage. Une fonction peut introduire un effet secondaire de verrouillage en apportant une modification observable à l’état d’accès concurrentiel. Par exemple, une fonction wrapper de verrou incrémente le nombre d’acquisitions de verrous ou le nombre de verrous pour un verrou donné. Vous pouvez annoter une fonction qui a un effet secondaire à partir d’une libération de verrou ou d’acquisition de verrou à l’aide _Acquires_lock_ ou _Requires_lock_held, respectivement. Sans ces annotations, une fonction est censée ne pas modifier le nombre de verrous après son retour. Si les acquisitions et versions ne sont pas équilibrées, elles sont considérées comme orphelines. Avertissement C26116 est émis lorsqu’une fonction a été annotée avec _Acquires_lock_, mais qu’elle n’acquiert pas de verrou, ou lorsqu’une fonction est annotée avec _Requires_lock_held et libère le verrou.

Exemple

L’exemple suivant génère l’avertissement C26116, car la fonction DoesNotLock a été annotée avec _Acquires_lock_ , mais ne l’acquiert pas. La fonction DoesNotHoldLock génère l’avertissement, car elle est annotée _Requires_lock_held et ne la contient pas.

typedef struct _DATA
{
    CRITICAL_SECTION cs;
} DATA;

_Acquires_lock_(p->cs) void DoesLock(DATA* p)
{
    EnterCriticalSection(&p->cs); // OK
}

_Acquires_lock_(p->cs) void DoesNotLock(DATA* p)
{
    // Warning C26116
}

_Requires_lock_held_(p->cs) void DoesNotHoldLock(DATA* p)
{
    LeaveCriticalSection(&p->cs); // Warning C26116
}

Voir aussi