Udostępnij za pośrednictwem


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 Unsafejest 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.