Aviso C26100

Condição de raça. A variável 'var' deve ser protegida por bloqueio 'lock'.

Comentários

A anotação _Guarded_by_ no código especifica o bloqueio a ser usado para proteger uma variável compartilhada. O aviso C26100 é gerado quando o contrato de proteção é violado.

Nome da análise de código: RACE_CONDITION

Exemplos

O exemplo a seguir gera o aviso C26100 porque há uma violação do _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);
}

A violação do contrato ocorre porque um bloqueio incorreto é usado na função Unsafe. Nesse caso, gCS é o bloqueio correto a ser usado.

Ocasionalmente, uma variável compartilhada só precisa ser protegida para acesso de gravação, mas não para acesso de leitura. Nesse caso, use a anotação _Write_guarded_by_, conforme mostrado no exemplo a seguir.

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

Este exemplo também gera aviso C26100 porque usa um bloqueio incorreto na função Unsafe2.