Предупреждение C26100
Гонки. Переменная var должна быть защищена блокировкой "lock".
Замечания
Заметка _Guarded_by_
в коде указывает блокировку, используемую для защиты общей переменной. Предупреждение C26100 создается при нарушении контракта охранника.
Имя анализа кода: RACE_CONDITION
Примеры
В следующем примере создается предупреждение C26100 из-за нарушения _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);
}
Нарушение контракта возникает из-за неправильной блокировки, используемой в функции Unsafe
. В этом случае gCS
используется правильная блокировка.
Иногда общая переменная должна быть защищена только для доступа на запись, но не для доступа на чтение. В этом случае используйте заметку _Write_guarded_by_
, как показано в следующем примере.
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);
}
В этом примере также создается предупреждение C26100, так как он использует неправильную блокировку функции Unsafe2
.