Partager via


Avertissement C26100

Condition de course. La variable 'var' doit être protégée par le verrou 'lock'.

Notes

L’annotation _Guarded_by_ dans le code spécifie le verrou à utiliser pour protéger une variable partagée. Avertissement C26100 est généré lorsque le contrat de garde est violé.

Nom de l’analyse du code : RACE_CONDITION

Exemples

L’exemple suivant génère un avertissement C26100, car il existe une violation du _Guarded_by_ contrat.

CRITICAL_SECTION gCS;

_Guarded_by_(gCS) int gData;

typedef struct _DATA {
   _Guarded_by_(cs) int data;
   CRITICAL_SECTION cs;
} DATA;

void Safe(DATA* p) {
   EnterCriticalSection(&p->cs);
   p->data = 1; // OK
   LeaveCriticalSection(&p->cs);
   EnterCriticalSection(&gCS);
   gData = 1; // OK
   LeaveCriticalSection(&gCS);
}

void Unsafe(DATA* p) {
   EnterCriticalSection(&p->cs);
   gData = 1; // Warning C26100 (wrong lock)
   LeaveCriticalSection(&p->cs);
}

La violation du contrat se produit parce qu’un verrou incorrect est utilisé dans la fonction Unsafe. Dans ce cas, gCS est le verrou approprié à utiliser.

Parfois, une variable partagée doit uniquement être protégée pour l’accès en écriture, mais pas pour l’accès en lecture. Dans ce cas, utilisez l’annotation _Write_guarded_by_ , comme illustré dans l’exemple suivant.

CRITICAL_SECTION gCS;

_Guarded_by_(gCS) int gData;

typedef struct _DATA2 {
   _Write_guarded_by_(cs) int data;
   CRITICAL_SECTION cs;
} DATA2;

int Safe2(DATA2* p) {
   // OK: read does not have to be guarded
   int result = p->data;
   return result;
}

void Unsafe2(DATA2* p) {
   EnterCriticalSection(&gCS);
   // Warning C26100 (write has to be guarded by p->cs)
   p->data = 1;
   LeaveCriticalSection(&gCS);
}

Cet exemple génère également un avertissement C26100, car il utilise un verrou incorrect dans la fonction Unsafe2.