Avviso C26100
Race condition. La variabile 'var' deve essere protetta dal blocco 'lock'.
Osservazioni:
L'annotazione _Guarded_by_
nel codice specifica il blocco da usare per proteggere una variabile condivisa. L'avviso C26100 viene generato quando il contratto di protezione viene violato.
Nome dell'analisi del codice: RACE_CONDITION
Esempi
L'esempio seguente genera l'avviso C26100 perché si verifica una violazione del _Guarded_by_
contratto.
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 violazione del contratto si verifica perché viene usato un blocco non corretto nella funzione Unsafe
. In questo caso, gCS
è il blocco corretto da usare.
In alcuni casi una variabile condivisa deve essere protetta solo per l'accesso in scrittura, ma non per l'accesso in lettura. In tal caso, usare l'annotazione _Write_guarded_by_
, come illustrato nell'esempio seguente.
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);
}
Questo esempio genera anche l'avviso C26100 perché usa un blocco non corretto nella funzione Unsafe2
.