不一致同步的属性¶
ID: cs/unsynchronized-getter
Kind: problem
Security severity:
Severity: error
Precision: medium
Tags:
- correctness
- concurrency
- external/cwe/cwe-662
Query suites:
- csharp-security-and-quality.qls
从多个线程并发访问的数据容易受到竞争条件和其他错误的影响。通常需要使用 lock
语句来确保并发代码的正确性并确保数据的一致性。但是,必须在所有可能并发调用的方法上始终如一地使用 lock
语句。
如果属性 setter 上存在 lock
语句,则意味着可以并发地为该属性赋值,因此也可以并发地读取该属性。因此,在属性 getter 上也需要使用 lock
语句。即使是简单的 getter 也需要使用 lock
语句来确保在读取字段时存在内存屏障。
建议¶
检查程序逻辑,以确定是否可以并发读取该属性。如有必要,请在属性 getter 中添加 lock
语句。
或者,如果不再需要,请从属性 setter 中删除 lock
语句。
示例¶
此示例显示了一个使用 lock
语句的属性 setter,但在 getter 中没有相应的 lock
语句。这意味着 count
与 GenerateDiagnostics()
不同步,并且属性 getter 中缺少读取屏障,这在某些 CPU 架构上可能会导致错误。
public int ErrorCount
{
get
{
return count;
}
set
{
lock (mutex)
{
count = value;
if (count > 0) GenerateDiagnostics();
}
}
}
解决方案是在属性 getter 中添加 lock
语句,如下所示
public int ErrorCount
{
get
{
lock (mutex)
{
return count;
}
}
set
{
lock (mutex)
{
count = value;
if (count > 0) GenerateDiagnostics();
}
}
}