Freigeben über


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 Unsafeeine 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 Unsafe2verwendet wird.