我有一个奇怪的情况,只出现在gcc -O0 -g输出上,而不是出现在gcc -O3上,而不出现在MSVC上,而不出现在MSVC调试输出上。
void func(void) {
static int enabled;
if (!enabled) {
// do stuff
enabled = 1;
}
}
gcc -O0 -g上出现的问题只是有时启用会返回0.但并非总是如此,只是在执行程序的某些罕见点上。该函数通常循环通过它。有什么可以让它感到困惑呢?可以在外部改变“启用”吗?但它在里面宣布了。
编辑:有一种方法可以在函数内部设置为0,但之前是一个没有打印的大胖printf [并且在测试中根本没有合理的方式发生它条件]。它似乎根本没有任何明确启用= 0的内容。
EDIT2:它只由主线程调用。
EDIT3:它变得更奇怪了。它不会出现在linux gcc -O0 -g上,而只出现在mingw-w64 [gcc -O0 -g]上。
EDIT4:启用了一个rwatch和watch on看起来显示在某些if(!enabled)(应该只读)的情况下它被改变了。
EDIT5:在#tingw-w64的帮助下,如果'布尔序列'被颠倒,那么它似乎'修复',例如enabled初始化为1,然后设置为0.“通过将静态变量初始化为非零值,将其放入.data节”“所以存在关于lcomm的问题”“我假设你有一个缓冲区溢出代码中的其他一些地方“
答案 0 :(得分:5)
我猜:你的某个地方有缓冲区溢出。在enabled
之前的主存储器中的变量被错误的大小覆盖,也覆盖了它之后的所有内容。或者,你有一个覆盖它的迷路指针。
进一步调试此方法的唯一有用方法是在thkala中建议在gdb中添加一个观察点。