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
.