首页 > 解决方案 > 如何让 ASAN 忽略子进程?

问题描述

我正在尝试在启用 ASAN 的情况下运行我的应用程序以搜索泄漏和其他错误,但是,由于我在应用程序中使用 popen,因此 sanitizer 似乎也报告了子进程错误(我真的不关心并且令人困惑)。

有没有办法让它忽略子进程?

我的环境是:Fedora 26、gcc 7.3.1、libasan 7.3.1-6

标签: linuxgccaddress-sanitizer

解决方案


我怀疑您正在使用LD_PRELOAD=libasan.so它将导致 Asan 运行时预加载到子进程。这将导致某种有限形式的清理,因为运行时将拦截和清理对标准 libc 函数(如mallocor )的调用memcpy

在 Asan 中没有内置方法可以禁用此功能,因此最好的选择是LD_PRELOAD在程序启动时重置:

int main() {
# ifdef __SANITIZE_ADDRESS__
  // Do not sanitize child processes
  // TODO: strip only libasan.so, keep everything else
  unsetenv("LD_PRELOAD");
# endif

推荐阅读