CERT.CONC.ATOMIC_TWICE_EXPR

不要在表达式中重复引用原子变量。

漏洞与风险

当对原子变量的运算被假定为原子但实际上为非原子时,可能会发生意外的数据争用,从而导致数据损坏和控制流无效。

漏洞代码示例

atomic_int n = ATOMIC_VAR_INIT(0);
   
int compute_sum(void) {
  return n * (n + 1) / 2;
}

此不符合要求的代码示例取原子全局变量 n,并使用公式 n * (n + 1) / 2 来计算 n + (n - 1) + (n - 2) + ... + 1。在表达式中的 n 的两次原子读取之间,n 的值可能会发生变化,从而产生不正确的结果。