Ostrzeżenie C26100
Wyścigu. Zmienna "var" powinna być chroniona przez blokadę "lock".
Uwagi
Adnotacja _Guarded_by_
w kodzie określa blokadę, która ma być używana do ochrony zmiennej udostępnionej. Ostrzeżenie C26100 jest generowane w przypadku naruszenia kontraktu straży.
Nazwa analizy kodu: RACE_CONDITION
Przykłady
Poniższy przykład generuje ostrzeżenie C26100, ponieważ występuje naruszenie _Guarded_by_
umowy.
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);
}
Naruszenie umowy występuje, ponieważ w funkcji Unsafe
jest używana nieprawidłowa blokada . W takim przypadku gCS
jest poprawna blokada do użycia.
Czasami współużytkowana zmienna musi być chroniona tylko na potrzeby dostępu do zapisu, ale nie na potrzeby dostępu do odczytu. W takim przypadku użyj adnotacji _Write_guarded_by_
, jak pokazano w poniższym przykładzie.
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);
}
Ten przykład generuje również ostrzeżenie C26100, ponieważ używa nieprawidłowej blokady w funkcji Unsafe2
.