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
.