Sdílet prostřednictvím


Upozornění C26100

Souběh. Proměnná var by měla být chráněna zámkem lock.

Poznámky

Poznámka _Guarded_by_ v kódu určuje zámek, který se má použít pro ochranu sdílené proměnné. Upozornění C26100 se vygeneruje při porušení smlouvy o stráži.

Název analýzy kódu: RACE_CONDITION

Příklady

Následující příklad vygeneruje upozornění C26100, protože došlo k porušení _Guarded_by_ smlouvy.

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);
}

K porušení smlouvy dochází, protože ve funkci Unsafeje použit nesprávný zámek . V tomto případě je správný zámek, gCS který se má použít.

Někdy se sdílená proměnná musí chránit jenom pro přístup k zápisu, ale ne pro přístup pro čtení. V takovém případě použijte poznámku _Write_guarded_by_ , jak je znázorněno v následujícím příkladu.

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);
}

Tento příklad také generuje upozornění C26100, protože používá nesprávný zámek ve funkci Unsafe2.