gpt4 book ai didi

c++ - 危险错误 Visual c++ 2005

转载 作者:可可西里 更新时间:2023-11-01 17:57:45 26 4
gpt4 key购买 nike

我在使用 visual studio 2005 运行 C++ Win32 控制台应用程序时遇到了一个非常严重的错误。使用以下项目属性运行下面的代码(简化)时会出现问题:C++|优化|优化|/O2(或/O1,或/Ox),C++|优化|整个程序优化|/GL,链接器|优化|/ltcg

    #include "stdafx.h"
#include <iostream>
using namespace std;
const int MAXVAL=10;
class MyClass
{
private:
int p;
bool isGood;
public:
int SetUp(int val);
};
int MyClass::SetUp(int val)
{
isGood = true;
if (MAXVAL<val)
{
int wait;
cerr<<"ERROR, "<<MAXVAL<<"<"<<val<<endl;
cin>>wait;
//exit(1); //for x64 uncomment, for win32 leave commented
}
if (isGood) p=4;
return 1;
}
int _tmain(int argc, _TCHAR* argv[])
{
int wait=0, setupVal1=10, setupVal2=12;
MyClass classInstance1;
MyClass classInstance2;
if (MAXVAL>=setupVal1) classInstance1.SetUp(setupVal1);
if (MAXVAL>setupVal2) classInstance2.SetUp(setupVal2);
cerr<<"exit, enter value to terminate\n";
cin>>wait;
return 0;
}

输出显示值 10 小于值 10!我已经发现将设置/O2 更改为/Od 可以解决问题(设置/Og 是/O2 的一部分,会导致问题),但这确实会减慢执行时间。稍微更改代码也可以解决问题,但是嘿,我永远无法确定代码是否可靠。我正在使用 Visual Studio 2005 专业版(版本 8.0.50727.867),操作系统为 Windows 7。我的问题是:有人可以尝试使用 Visual Studio 2005 重现此错误吗(我已经尝试过 VS 2010,没问题),如果可以,这里会发生什么?我可以假设较新的版本已经解决了这个问题吗(我考虑购买 VS 2012)谢谢

最佳答案

你可以显着减少你的例子,但仍然会遇到同样的问题!您不需要两个实例,也不需要任何其他局部变量或成员变量。此外,您可以硬编码 MAXVAL .

“解决”问题的快速总结:

  • 制作MAXVAL非常量 int
  • 设置setupVal2小于 10
  • 令人惊讶的是,改变了条件10<valval>10 !!!

这是我重现问题的最小版本:

#include "stdafx.h"
#include <iostream>
using namespace std;

class MyClass
{
public:
int SetUp(int val);
};

int MyClass::SetUp(int val)
{
if (10<val)
cout<<10<<"<"<<val<<endl;
return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
int setupVal1=10, setupVal2=12;
MyClass classInstance;

classInstance.SetUp(setupVal1);
classInstance.SetUp(setupVal2);

cin.get();
return 0;
}

正如反汇编所见,问题在于编译器认为 10<val始终为真,因此省略了检查。

_TEXT   SEGMENT
?SetUp@MyClass@@QAEHH@Z PROC ; MyClass::SetUp
; _val$ = ecx

; 16 : if (10<val)
; 17 : cout<<10<<"<"<<val<<endl;

mov eax, DWORD PTR __imp_?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z
push eax
push ecx
mov ecx, DWORD PTR __imp_?cout@std@@3V?$basic_ostream@DU?$char_traits@D@std@@@1@A
push 10 ; 0000000aH
call DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z
push eax
call ??$?6U?$char_traits@D@std@@@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@0@AAV10@PBD@Z ; std::operator<<<std::char_traits<char> >
add esp, 4
mov ecx, eax
call DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z
mov ecx, eax
call DWORD PTR __imp_??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z

; 18 : return 1;

mov eax, 1

; 19 : }

关于c++ - 危险错误 Visual c++ 2005,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18871149/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com