繁体   English   中英

AddressSanitizer:DEADLYSIGNAL 在使用 googletest 死亡测试时

[英]AddressSanitizer:DEADLYSIGNAL when using googletest deathtest

我将地址清理器与 gtest 结合使用。 我有一个测试引用了一个 unique_ptr,它是 null,随后失败了。

编辑:正如评论中所指出的,这个 ub. 为简单起见,假设存在 nullcheck 并在 ptr ist null 时发出信号。

这是测试和设计的一部分。 我的测试包含以下行:

ASSERT_EXIT(..., ::testing::KilledBySignal(SIGSEGV),".*")

没有消毒剂,测试通过。 使用消毒剂,它失败了,我从消毒剂那里得到以下反馈:

actual msg:
[  DEATH   ] AddressSanitizer:DEADLYSIGNAL
[  DEATH   ] =================================================================
[  DEATH   ] ==13242==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x55d0c75eb50f bp 0x7ffdd011b540 sp 0x7ffdd011b520 T0)
[  DEATH   ] ==13242==The signal is caused by a READ memory access.
[  DEATH   ] ==13242==Hint: address points to the zero page.

在我看来,消毒剂似乎检测到了 SIGSEGV 信号。 问题是:信号是按设计存在的,并且打算在那里。 有没有办法配置 asan 忽略它?

在我看来,消毒剂似乎检测到了 SIGSEGV 信号。 问题是:信号是按设计存在的,并且打算在那里。

那不是问题。 问题是,检测到信号后,消毒程序运行时执行exit(1) ,这导致进程以不同方式退出,并且ASSERT_EXIT检测到子进程实际上并没有因SIGSEGV而死。

有没有办法配置 asan 忽略它?

并不真地。

您可以将abort_on_error=1添加到ASAN_OPTIONS环境变量,这将导致子进程因SIGABRT而死,但这仍然不能满足您的ASSERT_EXIT


一般来说, DEATH_TEST很少值得写在论文上,当然让它们在 AddressSanitizer 下工作是毫无意义的。

您可以通过有条件地编译它跳过此测试(即在-fsanitize=address生效时编译它)。 有关如何实现该目标的文档

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM