gpt4 book ai didi

c - 如何在 C 中强制崩溃,取消引用空指针是一种(相当)可移植的方式吗?

转载 作者:太空狗 更新时间:2023-10-29 16:42:54 28 4
gpt4 key购买 nike

我正在为我当前的项目编写自己的测试运行程序。一个特性(这可能在测试运行器中很常见)是每个测试用例都在子进程中执行,因此测试运行器可以正确检测并报告崩溃的测试用例。

我还想测试测试运行器本身,因此一个测试用例必须强制崩溃。我知道“崩溃”未包含在 C 标准中,只是 可能 由于未定义的行为而发生。所以这个问题更多的是关于现实世界实现的行为。

我的第一次尝试是取消引用一个空指针:

int c = *((int *)0);

这在 GNU/Linux 和 Windows 上的调试版本中有效,但在发布版本中失败,因为未使用的变量 c 被优化掉了,所以我添加了

printf("%d", c); // to prevent optimizing away the crash

我以为我已经安顿下来了。然而,用 clang 而不是 gcc 尝试我的代码在编译过程中发现了一个惊喜:

   [CC]   obj/x86_64-pc-linux-gnu/release/src/test/test/test_s.o
src/test/test/test.c:34:13: warning: indirection of non-volatile null pointer
will be deleted, not trap [-Wnull-dereference]
int c = *((int *)0);
^~~~~~~~~~~
src/test/test/test.c:34:13: note: consider using __builtin_trap() or qualifying
pointer with 'volatile'
1 warning generated.

事实上,clang 编译的测试用例没有崩溃。

所以,我听从了警告的建议,现在我的测试用例如下所示:

PT_TESTMETHOD(test_expected_crash)
{
PT_Test_expectCrash();

// crash intentionally
int *volatile nptr = 0;
int c = *nptr;
printf("%d", c); // to prevent optimizing away the crash
}

这解决了我眼前的问题,测试用例在 gccclang 下“工作”(也就是崩溃)。

我猜是因为取消引用空指针是未定义的行为,clang 可以自由地将我的第一个代码编译成不会崩溃的东西。 volatile 限定符移除了在编译时确保这确实会取消引用 null 的能力。

现在我的问题是:

  • 这个最终代码是否保证 null 解引用确实在运行时发生?
  • 在大多数平台上,取消引用 null 确实是一种相当可移植的崩溃方式吗?

最佳答案

如果我是你,我就不会依赖这种方法。

你不能使用 abort(),它是 C 标准的一部分,保证会导致程序异常终止事件吗?

关于c - 如何在 C 中强制崩溃,取消引用空指针是一种(相当)可移植的方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44215510/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com