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() {}