6

Consider the following code:

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;
}

The output I expect is:

1,2
3,4

However, var1 appears to be corrupt:

$> ./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

Am I doing something wrong?

Addy
  • 2,414
  • 1
  • 23
  • 43
  • I get a warning (treated as an error, since I use `-Werror`) on the dataset line: `error: returning reference to temporary [-Werror=return-local-addr]`. Are you using a high warning level, and do you get any such warning? – Fred Larson Jan 04 '18 at 20:15
  • @FredLarson I never got a warning but if I turn it into an error I do indeed see it: `join.hpp:57:58: error: returning reference to local temporary object [-Werror,-Wreturn-stack-address]` – Addy Jan 04 '18 at 20:48
  • Yeah, something about this is producing undefined behavior. I think it has something to do with joining the results of zips, but I haven't tried data-driven tests before. – Fred Larson Jan 04 '18 at 20:53

1 Answers1

2

That's a bug. Long story short: please report it to the library maintainers.

Indeed, the zip operation returns a tuple std::tuple<int const&, int const&>:

and though the dataset itself is properly alive at the time, the tuple is returned by reference in the join operation...:

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

The proper fix would be to extend the dataset concept to not only have a ::sample type¹ but also a ::reference type. That's quite an invasive change.


¹ strangely not documented at this time

sehe
  • 374,641
  • 47
  • 450
  • 633