次の方法で共有


警告 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 も生成されます。