gpt4 book ai didi

c++ - 这是一个 VS2012 优化错误吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:18:16 26 4
gpt4 key购买 nike

在这里完成 VS2010 到 2012 的更新,有几个单元测试由于错误的代码生成或编程错误而失败,但我不确定是哪个。我发布的代码几乎与原始代码相同,并且也重现了问题。

这是一个案例;所有类/实现都在单独的文件中。

class Base
{
public:
virtual ~Base(){}
void DoIt(){ DoItImpl(); }
protected:
virtual void DoItImpl() = 0;
};

class Base2 : public Base
{
public:
virtual void DoStuff() = 0;
};

class Impl : public Base2
{
public:
Impl();
void DoStuff();
protected:
void DoItImpl();
};

void Impl::DoStuff()
{
throw std::runtime_error( "oops" );
}

void Impl::DoItImpl()
{
throw std::runtime_error( "oops" );
}

上面驻留在一个 dll 中,并在一个 exe 中使用 unittest++ 进行了测试(为了清楚起见,我扩展了 CHECK_THROW 宏,但没有改变任何东西):

SUITE( Base )
{
TEST( Impl )
{
Impl c;
bool caught = false;
try
{
c.DoIt();
}
catch( const std::exception& )
{
caught = true;
}

//this point is never reached, instead control goes to the
//try/catch in unittest++'s ExecuteTest function
CHECK( caught );
}
}

无论是否是错误,是否有我可以立即使用的解决方法,或者关于如何避免这种情况的一些一般规则?

编辑 添加了 DoStuff() 的实现,如果我调用它而不是 DoIt() 就没有问题!

编辑 这应该排除单元测试框架或任何其他代码出现问题的可能性,或者通过 const 引用捕获,或者编译器不知道 runtime_error 来自异常;我扩展了 unittest 宏以显示它们的实际作用,并创建了一个仅包含此源文件的新项目:

namespace SuiteImpl
{
class TestImpl
{
public:
TestImpl() {}
virtual void RunImpl() const;
};

void TestImpl::RunImpl() const
{
xxx::Impl c;
try
{
c.DoIt();
}
catch( std::exception& )
{
std::cout << "good" << std::endl;
}
}
}

int main()
{
SuiteImpl::TestImpl impl;

try
{
impl.RunImpl();
}
catch( const std::exception& )
{
std::cout << "not good" << std::endl;
}
}

输出不好

最佳答案

这是 confirmed to be an optimizer bug他们希望在 VS2012 Update 4 中修复它。

关于c++ - 这是一个 VS2012 优化错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17430084/

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