这是一个VS2012优化bug吗?

4

我正在进行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" );
}

上述代码位于动态链接库中,并且在可执行文件中使用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派生自异常的可能性; 我扩展了单元测试宏以显示它们实际上要做什么,并创建了一个仅包含此源文件的新项目。
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;
  }
}

输出结果不好

可能与https://dev59.com/VG435IYBdhLWcg3w-lP2#5108118有关。确保使用VS2012编译dll和unittest++。 - Chris Cooper
@BalogPal 确实,调试状态可以,发布状态不行。我不确定你所说的“仅此片段”指的是什么;在项目中有数百个测试,但是这个测试失败了。 - stijn
@ChrisCooper 所有的编译都是使用 VS212 进行的,并且使用相同的设置。另请参见编辑。 - stijn
2
@stijn:我的意思是在良好的隔离环境中。发布的代码看起来很好。但是,如果某些不相关的部分导致未定义的行为,或者您设法破坏ODR,这可能会在良好的编译器中表现为观察到的错误行为。因此,您能否仅使用此最小代码重现错误? - Balog Pal
在我看来,这更像是您的单元测试框架的功能,而不是您正在测试的代码。 - John Dibling
显示剩余5条评论
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接