[英]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.