如何使用 Google Test 捕获分段错误?

2023-11-23

如何测试函数不会产生分段错误?

这是我现在所知道的,我可以做的:

EXPECT_DEATH(foo(nullParameter))

在函数内部,会产生分段错误,这是我想要失败的行为。上面的代码片段将使测试通过,因为这是预期的,进程的死亡。

现在,我怎样才能让它失败呢?


这是一个如果传递空指针参数就会出现段错误的函数,否则会出现段错误 不是:

int deref(int * pint)
{
    return *pint;
}

这是一个测试该行为的 googletest 程序:

main.cpp

#include <gtest/gtest.h>

int deref(int * pint)
{
    return *pint;
}


TEST(test_deref_1,will_segfault)
{
    ASSERT_EXIT((deref(nullptr),exit(0)),::testing::KilledBySignal(SIGSEGV),".*");
}


TEST(test_dref_2,will_not_segfault)
{
    int i = 42;
    ASSERT_EXIT((deref(&i),exit(0)),::testing::ExitedWithCode(0),".*");
}


int main(int argc, char **argv) {
    ::testing::InitGoogleTest(&argc, argv);
    return RUN_ALL_TESTS();
}

编译并链接:

$ g++ -Wall -Wextra -pedantic -o tester main.cpp -pthread -lgtest

Run:

$ ./tester 
[==========] Running 2 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 1 test from test_deref_1
[ RUN      ] test_deref_1.will_segfault
[       OK ] test_deref_1.will_segfault (168 ms)
[----------] 1 test from test_deref_1 (168 ms total)

[----------] 1 test from test_dref_2
[ RUN      ] test_dref_2.will_not_segfault
[       OK ] test_dref_2.will_not_segfault (1 ms)
[----------] 1 test from test_dref_2 (1 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 2 test cases ran. (169 ms total)
[  PASSED  ] 2 tests.

据我所能想象,TEST(test_deref_1,will_segfault)是一个毫无意义的测试, 因为我想不出在什么情况下我想保证 我自己认为程序会由于对某个调用进行特定调用而出现段错误 函数是我写的。

TEST(test_dref_2,will_not_segfault)可能是一种有用的测试。有效, 这是一个测试,该程序:

int main()
{
    int i = 42;
    defref(&i);
    exit(0);
}

将终止于exit(0)而不是以任何过早的异常方式。更好的名字 这个测试可能是TEST(test_dref,does_not_crash),或类似的。

这是一种可能有用的测试,因为它可能存在很大的风险failing, if defref是一些足够复杂的代码,以及测试套件 可以报​​告该故障而不会导致自身崩溃。我们可以通过重写来强制失败 它:

TEST(test_dref_2,will_not_segfault)
{
    ASSERT_EXIT((deref(nullptr),exit(0)),::testing::ExitedWithCode(0),".*");
}

然后测试测试报告为:

$ ./tester
[==========] Running 2 tests from 2 test cases.
[----------] Global test environment set-up.
[----------] 1 test from test_deref_1
[ RUN      ] test_deref_1.will_segfault
[       OK ] test_deref_1.will_segfault (147 ms)
[----------] 1 test from test_deref_1 (147 ms total)

[----------] 1 test from test_dref_2
[ RUN      ] test_dref_2.will_not_segfault
main.cpp:25: Failure
Death test: (deref(nullptr),exit(0))
    Result: died but not with expected exit code:
            Terminated by signal 11 (core dumped)
Actual msg:
[  DEATH   ] 
[  FAILED  ] test_dref_2.will_not_segfault (90 ms)
[----------] 1 test from test_dref_2 (90 ms total)

[----------] Global test environment tear-down
[==========] 2 tests from 2 test cases ran. (237 ms total)
[  PASSED  ] 1 test.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] test_dref_2.will_not_segfault

 1 FAILED TEST

See 的文档{ASSERT|EXPECT}_EXIT了解这些宏。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Google Test 捕获分段错误? 的相关文章

随机推荐

  • 如何处理不断发展的 c++ std:: 命名空间?例如: std::tr1::shared_ptr 与 std::shared_ptr 与 boost::shared_ptr 与 boost::tr1::shared_ptr

    对于我当前正在处理的代码 我们有时需要在一些旧系统上使用旧编译器进行编译 例如 我们在旧 IBM BlueGene L 上运行 sims 它的支持合同规定了一些相当旧的 C 编译器 代码本身使用了shared ptrs 最初是为了使用std
  • Eclipse Juno - 为什么对未使用的带注释的私有字段没有警告?

    在以前版本的 Eclipse 中 这工作得很好 在错误 警告中我检查了 Unused private field gt Warning 但这似乎不起作用 例如 public class Main Resource private int a
  • UIButton addTarget self 是如何工作的?

    我试着找出原因self指向 GameViewController 而不是 Answer GameViewController swift class GameViewController UIViewController var gamep
  • Java中递归搜索目录

    在 Java 中查找具有特定名称的目录的最佳方法是什么 我正在查找的目录可以位于当前目录或其子目录之一 在 Java 8 中通过流API Optional
  • 实现一个方法,将块用作回调

    我想写一个类似的方法 void myMethodWithView UIView exampleView completion void BOOL finished completion 我基本上已经剥离了从 Apple 的类方法之一中获取的
  • 如何从身份验证代理后面运行 svcutil.exe

    我想运行svcutil exe用于访问 Internet 上的 Web 服务的工具 不幸的是 每当我尝试时 我都会收到一堆错误 其中包括以下消息 请求失败 HTTP 状态为 407 需要代理身份验证 ISA 服务器需要授权才能完成请求 对
  • 在 Flex/Actionscript 中编码 HTML

    有没有可以转换的函数 Me Myself I to Me Myself amp I 我在 Flex 文档中找不到任何内容 Thanks Check this出去 没有要包括的 SWC 基本上是 var s String new XMLNod
  • primefaces 中 richfaces 组件的替代方案

    我目前正在尝试将项目从 RichFaces 3 0 迁移到 PrimeFaces 6 0 但我没有在 PrimeFaces 中找到类似的组件 a4j 区域 丰富 组件控件 rich hash参数 Follow Richfaces 到 Pri
  • ORA-27101: 共享内存领域不存在

    当我启动oracle时 我遇到了这个错误 我检查了 Oracle Home 和 SID 一切都设置正确 ORA 27101 共享内存领域不存在 请帮我找出解决方案 提前致谢 该错误通常意味着没有可连接的 Oracle 实例 进程 需要有人登
  • 如何在 IntelliJ IDEA 中复制 JSON 中的路径?

    是否可以复制 JSON 文件中的路径 例如在这个文件中 a b c keyC 当我在 keyC 我会按一些热键 我会得到一个a b c剪贴板中的字符串 我知道这篇文章很旧 但我想我会给出更新的答案 我遇到这个问题是因为我正在寻找同样的东西
  • Apple 的 APNS 传输有时很慢

    使用我们自己的内置 APNS 推送系统 用 PHP 编写 我们可以在某些事件上推送到我们的设备 设备会立即收到某些通知 而某些设备可能需要长达 15 分钟才能看到 我们保持连接打开 按照 Apple 的要求 并根据记录的错误重置连接 通常是
  • 使用 sc.textFile() 加载本地文件到 Spark

    Question 如何使用 sc textFile 将文件从本地文件系统加载到 Spark 我需要改变什么吗 env变量 另外 当我在未安装 Hadoop 的 Windows 上尝试相同的操作时 我遇到了相同的错误 Code gt val
  • 需要Windows CE 5.0模拟器

    我需要一个 Windows CE 5 0 模拟器来测试我正在开发的嵌入式设备 不是 PDA 或智能手机 应用程序 这是我已经尝试过的 Visual Studio 2008 Pro 包含一个模拟器 不幸的是 它不包括 Windows CE 映
  • 将 Delphi 应用程序转换为作为服务运行 - 有必要吗?

    我有一个 delphi 应用程序 它记录来自不同位置的数据并将数据写入文件 该应用程序有一个相当广泛的 GUI 可以显示数据 配置选项等 一位用户请求将该应用程序更改为可以作为服务运行 他的理由是 该应用程序可以在启动时启动并在没有任何用户
  • 如何在 MVC 视图中显示对象列表?

    我有一个返回字符串列表的方法 我只是想在视图中以纯文本形式显示该列表 这是来自控制器的列表 public class ServiceController Controller public string Service Some code
  • Flutter resizeToAvoidBottomInset true 不适用于 Expanded ListView

    键盘隐藏了我的ListView 分组列表视图 我认为这是因为Expanded Widget My body Column children Expanded child Padding padding const EdgeInsets al
  • 如何打印_r $_POST 数组?

    我有下表
  • mysql 左外连接

    我有两张桌子 employee包含字段employee id 名字 中间名 姓氏 timecard包含字段employee id 入职时间 超时 tc date transaction 我想选择具有与考勤卡相同的employee id 且日
  • 在 PostgreSQL 中生成两个日期之间的时间序列

    我有一个这样的查询 可以很好地生成两个给定日期之间的一系列日期 select date 2004 03 07 j i as AllDate from generate series 0 extract doy from date 2004
  • 如何使用 Google Test 捕获分段错误?

    如何测试函数不会产生分段错误 这是我现在所知道的 我可以做的 EXPECT DEATH foo nullParameter 在函数内部 会产生分段错误 这是我想要失败的行为 上面的代码片段将使测试通过 因为这是预期的 进程的死亡 现在 我怎