这是VS2012优化错误吗?

时间:2013-07-02 15:51:06

标签: c++ optimization visual-studio-2012 unittest++

在这里完成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()而不是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; } } ,那么就没有问题!

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

not good

输出为{{1}}。

1 个答案:

答案 0 :(得分:1)

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