我将地址过滤器与gtest结合使用,我有一个测试引用了一个unique_ptr,它为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忽略这一点?
1条答案
按热度按时间niwlg2el1#
在我看来,这好像是消毒剂检测到了SIGSEGV信号。问题是:信号通过设计而存在于那里,并且打算存在于那里。
这不是问题所在,问题在于 * 在 * 检测到信号之后,杀毒程序运行时执行
exit(1)
,这导致进程以 * 不同的方式 * 退出,并且ASSERT_EXIT
检测到子进程实际上并没有随着SIGSEGV
而死亡。有没有办法配置asan忽略这个问题?
不太喜欢。
有一个
abort_on_error=1
可以添加到ASAN_OPTIONS
环境变量中,这将导致子进程与SIGABRT
一起死亡,但这仍然不能满足您的ASSERT_EXIT
。一般来说,
DEATH_TEST
很少值得写在纸上,当然让它们在AddressSanitizer下工作是毫无意义的。你可以通过有条件地编译来跳过这个测试(例如,当
-fsanitize=address
生效时编译它 * out *)。