【问题标题】:Boost's data-driven tests' join operator `+` corrupts first columnBoost 的数据驱动测试的连接运算符 `+` 损坏了第一列
【发布时间】:2018-01-04 19:48:47
【问题描述】:

考虑以下代码:

BOOST_DATA_TEST_CASE(
      sampleTest,
      (data::make(1) ^ data::make(2)) + (data::make(3) ^ data::make(4)),
      var1,
      var2)
{
  std::cout << var1 << "," << var2 << std::endl;
}

我期望的输出是:

1,2
3,4

但是,var1 似乎已损坏:

$> ./MyTests --run_test=Tests/sampleTest
Running 2 test cases...
202875304,2
202875304,4

*** No errors detected
$> ./MyTests --run_test=Tests/sampleTest
Running 2 test cases...
83976616,2
83976616,4

*** No errors detected

我做错了吗?

【问题讨论】:

  • 我在数据集行:error: returning reference to temporary [-Werror=return-local-addr] 上收到警告(被视为错误,因为我使用了-Werror)。您是否使用了较高的警告级别,是否收到任何此类警告?
  • @FredLarson 我从来没有收到过警告,但如果我把它变成错误,我确实看到了:join.hpp:57:58: error: returning reference to local temporary object [-Werror,-Wreturn-stack-address]
  • 是的,这会产生未定义的行为。我认为这与加入 zips 的结果有关,但我之前没有尝试过数据驱动的测试。

标签: c++ boost boost-test


【解决方案1】:

这是一个错误。长话短说:请向图书馆维护人员报告。

确实,zip 操作返回一个元组std::tuple&lt;int const&amp;, int const&amp;&gt;

虽然当时数据集本身是正常的,但元组在 join 操作中通过引用返回...:

    sample const&       operator*() const   { return m_first_size > 0 ? *m_it1 : *m_it2; }

正确的解决方法是将dataset concept 扩展为不仅具有::sample 类型¹,而且还具有::reference 类型。这是一个相当具有侵略性的变化。


¹ 奇怪的是,此时没有记录

【讨论】:

  • 您可能应该包含一个链接,这样他们就不必做双重工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-18
相关资源
最近更新 更多