Warnung C26100
Rennbedingung. Variable 'var' sollte durch die Sperre 'lock' geschützt werden.
Hinweise
Die _Guarded_by_
Anmerkung im Code gibt die Sperre an, die zum Schützen einer freigegebenen Variablen verwendet werden soll. Warnung C26100 wird generiert, wenn der Guard-Vertrag verletzt wird.
Codeanalysename: RACE_CONDITION
Beispiele
Im folgenden Beispiel wird die Warnung C26100 generiert, da ein Vertragsverstoß vorliegt _Guarded_by_
.
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);
}
Die Vertragsverletzung tritt auf, weil in der Funktion Unsafe
eine falsche Sperre verwendet wird. In diesem Fall gCS
ist die richtige zu verwendende Sperre.
Gelegentlich muss eine freigegebene Variable nur für schreibgeschützten Zugriff geschützt werden, aber nicht für lesezugriff. Verwenden Sie in diesem Fall die _Write_guarded_by_
Anmerkung, wie im folgenden Beispiel gezeigt.
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);
}
In diesem Beispiel wird auch die Warnung C26100 generiert, da eine falsche Sperre in der Funktion Unsafe2
verwendet wird.