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 Unsafe
je 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
.