静态var的奇怪条件只出现在gcc的调试版本中

j r*_*riv 2 c debugging gcc gdb mingw

我有一个奇怪的情况,只出现在gcc -O0 -g输出上,而不是在gcc -O3上,而不是在MSVC上,而不是在MSVC调试输出上.

void func(void) {
  static int enabled;

  if (!enabled) {
    // do stuff
    enabled = 1;
   }

}
Run Code Online (Sandbox Code Playgroud)

gcc -O0 -g上出现的问题只是有时启用会返回0.但并非总是如此,只是在执行程序的某些罕见点上.该函数通常循环通过它.有什么可以让它感到困惑呢?可以在外部改变"启用"吗?但它在里面宣布了.

编辑:有一种方法可以在函数内部设置为0,但之前是一个大的fatf,它根本不打印[并且在测试条件下根本没有逻辑方式发生].它似乎根本不会发生任何明确启用= 0的事情.

EDIT2:它只由主线程调用.

编辑3:它变得更奇怪.它不会出现在linux gcc -O0 -g上,而只出现在mingw-w64 [gcc -O0 -g]上.

EDIT4:启用了rwatch和watch on似乎表明在if(!enabled)(应该只读)的某些情况下它被改变了.

EDIT5:在#tingw-w64的帮助下,如果'布尔序列'被反转,例如启用被初始化为1,然后设置为0,则通过非零值初始化静态变量,看起来"修复"它进入.data部分""所以有一个关于lcomm的问题""我假设你的代码中的其他地方有一个缓冲区溢出"

Mar*_*wis 5

我猜:你的某个地方有缓冲区溢出.在enabled使用错误的大小覆盖之前,主内存中的变量也会被覆盖.或者,您有一个覆盖它的杂散指针.

进一步调试的唯一有用方法是在thkala中建议在gdb中添加一个观察点.