我想使用-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.
有没有其他方法可以保存我单位测试中的消毒剂错误?
答案 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是否具有更新的功能来设置文件描述符。