c++ 地址消毒剂:使用Googletest死亡测试时的死亡信号

dkqlctbz  于 2023-01-22  发布在  Go
关注(0)|答案(1)|浏览(105)

我将地址过滤器与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忽略这一点?

niwlg2el

niwlg2el1#

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

相关问题