警告 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
中使用了错误的锁。