如何设置ASAN / UBSAN报告输出

时间:2016-09-25 12:08:54

标签: gcc clang sanitizer ubsan address-sanitizer

我想使用-fsanitize=address,undefined运行我的单元测试套件,并将所有清理程序错误写入report.txt文件。默认情况下,所有清理程序错误都会写入stdout,但软件也会将信息写入stdout,因此很难检测到错误。我试过了:

export ASAN_OPTIONS="log_path=asan.log"
./mytests

我还尝试在运行测试之前调用C API:

#include <sanitizer/asan_interface.h>

__sanitizer_set_report_path("/tmp/asan.log")

然而似乎两者都没有用,所有错误都只写入stdout。我正在使用Debian测试:

root@94e239ad460a:~# gcc --version
gcc (Debian 6.1.1-11) 6.1.1 20160802
Copyright (C) 2016 Free Software Foundation, Inc.

有没有其他方法可以保存我单位测试中的消毒剂错误?

3 个答案:

答案 0 :(得分:1)

嗯,我已成功多次使用log_path。如果它对您不起作用,请向ASan github报告错误(最好用最小的复制品)。

答案 1 :(得分:1)

我意识到我的二进制文件没有读取权限。一个简单的chmod 500 <exe_path>解决了我的问题。

答案 2 :(得分:0)

我经常要做的是确保目录存在。 您可以使用Qt:

QDir().mkpath("/tmp");

Asan会在您的文件名后附加一个PID,但我认为您不能禁用它。

在我的common_interface_defs.h中只有__sanitizer_set_report_path,但我看到gcc's master has a more recent function是您传递文件描述符的地方:

void __sanitizer_set_report_fd(void *fd);

您可以检查平台的gcc / clang是否具有更新的功能来设置文件描述符。