C++ 如何避免C++;未定义的行为愚弄谷歌测试

C++ 如何避免C++;未定义的行为愚弄谷歌测试,c++,googletest,undefined-behavior,C++,Googletest,Undefined Behavior,我正在为我的容器类编写测试,其中许多测试检查查询方法,这些方法返回true或false。例如: myContainer.add(obj); EXPECT_TRUE(myContainer.contains(obj)); 问题是,即使没有MyContainer实现,这些测试中的许多都能通过 我认为我已经找到了导致这种情况的原因,如下所示(问题是RealityTest.skillypasss): 测试中使用的函数定义如下: bool random_bool() { static std::ra

我正在为我的容器类编写测试,其中许多测试检查查询方法,这些方法返回
true
false
。例如:

myContainer.add(obj);
EXPECT_TRUE(myContainer.contains(obj));
问题是,即使没有
MyContainer
实现,这些测试中的许多都能通过

认为我已经找到了导致这种情况的原因,如下所示(问题是
RealityTest.skilly
passs):

测试中使用的函数定义如下:

bool random_bool() {
  static std::random_device dev;
  static std::uniform_int_distribution dist(0, 1);
  return dist(dev);
};

bool sneaky() { cout << "brought to you by GCC (C++17)" << endl; }

bool no_bool() {}
bool random\u bool(){
静态std::随机_设备开发;
静态标准:均匀分布区(0,1);
返回区(开发);
};

bool skilly(){cout您的编译器应该警告您函数中存在不返回值的路径。如果不返回值,请提高警告级别(例如
-Wall
和/或
-Wextra
),并确保这些警告未被抑制

如果您(或您的同事)倾向于忽略这些警告,请使用将它们(嗯,所有警告)转化为编译错误-这样,如果存在使这些警告失效的情况,例如,具有不返回值的路径,您的项目将不会编译


也就是说,GoogleTest无法帮助您找到这些错误-它只适用于已编译的对象,因此它无法告诉您的
bool skilly()
函数没有正确的返回值…请记住:…或允许1。打开并侦听(例如升级到错误)编译器警告,2.不要依赖单元测试来找到UB,这不是它们的用途。UB可以通过定义愚弄您的单元测试。您使用
-Werror
构建,这些测试失败是因为您的项目没有构建。虽然您可以显示测试结果的图像,但请不要显示代码的图像或一般文本。好吧……我承认没有出于某种奇怪的原因-我没有想到Werror。谢谢你,我肯定会用它:)。
bool random_bool() {
  static std::random_device dev;
  static std::uniform_int_distribution dist(0, 1);
  return dist(dev);
};

bool sneaky() { cout << "brought to you by GCC (C++17)" << endl; }

bool no_bool() {}