Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
.