Advertencia C26100

Condición de carrera. La variable 'var' debe protegerse mediante el bloqueo 'lock'.

Comentarios

La anotación _Guarded_by_ del código especifica el bloqueo que se va a usar para proteger una variable compartida. La advertencia C26100 se genera cuando se infringe el contrato de protección.

Nombre del análisis de código: RACE_CONDITION

Ejemplos

En el ejemplo siguiente se genera la advertencia C26100 porque hay una infracción del _Guarded_by_ contrato.

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 infracción del contrato se produce porque se usa un bloqueo incorrecto en la función Unsafe. En este caso, gCS es el bloqueo correcto que se va a usar.

En ocasiones, una variable compartida solo tiene que protegerse para el acceso de escritura, pero no para el acceso de lectura. En ese caso, use la anotación _Write_guarded_by_, tal como se muestra en el ejemplo siguiente.

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

En este ejemplo también se genera la advertencia C26100 porque usa un bloqueo incorrecto en la función Unsafe2.