다음을 통해 공유


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

이 예제에서는 또한 Unsafe2 함수에서 잘못된 잠금을 사용하기 때문에 경고 C26100을 생성합니다.