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

标签 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() 就没有问题!

编辑 这应该排除单元测试框架或任何其他代码出现问题的可能性,或者通过 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/

相关文章:

c++ - 在 C++ 中对结构进行排序

c++ - 来自 std::vector 的 pop-push 元素并重用元素

javascript - 是否可以进一步优化该洪水填充算法?

unit-testing - 如何在 Visual Studio 2012 Professional 中连续运行单元测试?

c++ - 缺少 SDKDDKVer.h,但安装了 WinSDK? (C++ 头文件问题)

vb.net - Visual Studio 2012 - 自定义先决条件未出现在“属性”>“先决条件”对话框中

c++ - UTF-8 和 TinyXML

javascript - 如何处理大量数据 - 元素周期表和元素

java - 删除 ArrayList 中第一次和最后一次出现之间的重复元素以优化路径

r - 优化 R 中向量的每个累积子集的计算