Предупреждение 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.