【发布时间】:2013-08-06 07:44:49
【问题描述】:
这可能是编译器错误吗?我的环境是:
- Win7 专业版(64 位)
- VS2012(更新 3)
我编译下面的微型控制台程序。 x64 位发布/调试版本工作正常。 x32 调试版本也可以正常工作。但是,x32 发布版本显示“BUG!”。
如果我禁用“整个程序优化”将解决问题。
有什么想法吗?
-
#include <string>
#include <iostream>
int main()
{
std::string const buffer = "hello, world";
std::string::size_type pos = 0;
std::string::size_type previous_pos;
while (pos != std::string::npos)
{
previous_pos = ++pos;
pos = buffer.find('w', pos);
}
if (previous_pos == std::string::npos)
{
std::cout << "BUG!!"<< std::endl;
}
return 0;
}
【问题讨论】:
-
如果循环大约零次,则 previous_pos 未初始化。
-
将 previous_pos 初始化为零时会发生什么?也许编译器基于它未初始化的事实做出了一些假设?
-
另外,将 pos 的 pre-increment 更改为 post-increment 似乎可以让 bug 消失。
-
while (pos != std::string::npos) { previous_pos = ++pos; pos = buffer.find('w', pos); std::cout
-
另外,将 previous_post 更改为 = pos 和 pos = buffer.find('w', pos++) 有一些有趣的结果。在调试中,previous_pos 将在 0 和 7 之间交替。在版本 0 和 8.... 再次,我在循环中使用 cout。
标签: c++ visual-studio-2012 compiler-optimization compiler-bug