C ++,Clang 3.4.2,GoogleTest(gtest)1.7.0&重复名称:未定义的行为或潜在的错误

时间:2014-08-27 06:36:41

标签: c++ clang undefined-behavior googletest

我最近发现了这种设置(clang& gtest)和重复名称(在下面的例子中演示)有些奇怪。没有生成编译器警告/错误,但在运行时似乎发生了某种“类型交换”。我可能正在以一种产生“未定义行为”的方式进行编程。

示例:

main.cpp:
#include "gtest/gtest.h"
int main(int argc, char **argv) {
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

test_a.cpp
#include <boost/optional.hpp>
#include "gtest/gtest.h"
namespace test { 
class TestA : public ::testing::Test {
}; 
struct Param {
  boost::optional<int> x_;
  boost::optional<int> y_;
  int sum_;
}; 
class TestAWithParam :
    public TestA,
    public ::testing::WithParamInterface<Param> {}; 
TEST_P(TestAWithParam, Param) {
  const auto p = GetParam();
  ASSERT_TRUE(p.x_ && p.y_);
  EXPECT_EQ(p.sum_, *p.x_ + *p.y_);
} 
INSTANTIATE_TEST_CASE_P(
    All,
    TestAWithParam,
    ::testing::Values(
        Param{1, 2, 3},
        Param{2, 3, 5},
        Param{3, 4, 7}));
}  // namespace test

test_b.cpp
#include "gtest/gtest.h"
namespace test {
class TestB : public ::testing::Test {};
struct Param {
  int x_; 
  int y_; 
};
class TestBWithParam :
    public TestB,
    public ::testing::WithParamInterface<Param> {}; 
TEST_P(TestBWithParam, Param) {
  const auto p = GetParam();
  EXPECT_EQ(p.x_, p.y_);
}
INSTANTIATE_TEST_CASE_P(
    All,
    TestBWithParam,
    ::testing::Values(
      Param{1, 1}, 
      Param{2, 2}, 
      Param{3, 3}));
}  // namespace test

我减少了间距以缩短代码 - 所以不要压力,我实际上并没有像这样编写代码:P

测试应用程序因分段错误而失败。

如果我重命名其中一个Param结构(这样重复的命名不再存在),测试程序运行正常,没有失败的测试。

请注意,我经历了类似的UB和'非参数化'测试 - 所以我不会说这是一个TEST_P问题。

非常感谢任何帮助:)

感谢。

0 个答案:

没有答案