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
.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour