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