读书人

vs调试时的这个bug是什么原因促成的

发布时间: 2012-11-05 09:35:12 作者: rapoo

vs调试时的这个bug是什么原因造成的?

C/C++ code
int _tmain(int argc, _TCHAR* argv[]) {    for (int i = 1; i < 2; i++) {        ;    }    int i = 3;    return 0;    // breakpoint}


watch窗口,输入i或者&i,显示的是for中的变量i的信息

[解决办法]
试了一下,确实存在这个bug,
进入debug模式,执行完 int i = 3;这个语句后,watch窗口里的i还是2,没有变成3.最后到花括号 }才变。
另外程序运行时正常的,在int i = 3;后面加个printf("%d",i);打印出来的是3.
[解决办法]
这个问题以前跟踪过

自从VS2005有了 /Zc:forScope[-] 编译选项,微软就不断收到 bug 报告
http://msdn.microsoft.com/en-us/library/84wcsx8x(v=vs.80).aspx

但直到VS2010也没修复,反而有位微软VS专家否认这是 bug,而是设计
http://connect.microsoft.com/VisualStudio/feedback/details/651936/wrong-values-for-local-variables-in-vs2010-debugger

的确,如果用 /Zc:forScope[-],那么楼主那个例子在 int i = 3; 之后,再写一句 i=4; 什么的,就会有警告
warning C4288: nonstandard extension used : 'i' : loop control variable declared in the for-loop is used outside the for-loop scope; it conflicts with the declaration in the outer scope

这说明VS的做法,的确就是“扩展”,而且程序不会有问题,只不过调试器的 watch 窗口选择了forscope内的同名变量,而在 local 窗口内则同时显示两个同名变量

于是,VS2012仍然是这么“设计”的……

为避免watch问题,不要用同名变量,或者干脆在for循环外再套一个大括号即可
C/C++ code
    {        for (int i = 1; i < 2; i++) {            ;        }    } 

读书人网 >C++

热点推荐