C26100
Warnung C26100: Racebedingung.Variable <var> sollte von der Sperre <Sperre> geschützt sein.
Die _Guarded_by_ Anmerkung im Code gibt die Sperre an, die verwendet werden, dass eine freigegebene Variable zu schützen.Warnung C26100 wird generiert, wenn der Wächtervertrag verstoßen wird.
Beispiel
Im folgenden Beispiel wird die Warnung C26100, da es eine Verletzung des Vertrags _Guarded_by_ gibt.
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, wenn eine falsche Sperre in der Funktion Unsafe verwendet wird.In diesem Fall ist gCS die richtige Sperre, zu verwenden.
Gelegentlich muss eine freigegebene Variable jedoch nicht für Schreibzugriff für Lesezugriff nur geschützt werden.In diesem Fall wird 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);
}
Dieses Beispiel generiert auch die Warnung C26100, da es eine falsche Sperre in der Funktion Unsafe2 verwendet.