bugprone-dynamic-static-initializers

查找在头文件中动态初始化的静态变量实例。

这在某些多线程环境中可能造成问题。例如,当禁用针对运行时初始化的静态变量的编译器生成的同步指令(例如,通过 -fno-threadsafe-statics)时,即使某个特定项目采取了必要的预防措施,通过提供自己的同步来防止初始化期间的竞争条件,来自其他项目的包含头文件可能不会这样做。因此,此类检查有助于确保禁用针对静态变量初始化的编译器生成的同步不会造成问题。

考虑以下代码

int foo() {
  static int k = bar();
  return k;
}

当禁用静态初始化的同步时,如果两个线程都第一次调用 foo,则可能出现 k 被双重初始化的情况,从而造成竞争条件。