Condividi tramite


Avviso C26100

Race condition. La variabile 'var' deve essere protetta dal blocco 'lock'.

Osservazioni:

L'annotazione _Guarded_by_ nel codice specifica il blocco da usare per proteggere una variabile condivisa. L'avviso C26100 viene generato quando il contratto di protezione viene violato.

Nome dell'analisi del codice: RACE_CONDITION

Esempi

L'esempio seguente genera l'avviso C26100 perché si verifica una violazione del _Guarded_by_ contratto.

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

La violazione del contratto si verifica perché viene usato un blocco non corretto nella funzione Unsafe. In questo caso, gCS è il blocco corretto da usare.

In alcuni casi una variabile condivisa deve essere protetta solo per l'accesso in scrittura, ma non per l'accesso in lettura. In tal caso, usare l'annotazione _Write_guarded_by_ , come illustrato nell'esempio seguente.

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

Questo esempio genera anche l'avviso C26100 perché usa un blocco non corretto nella funzione Unsafe2.