背景
最近的项目代码需要做动态扫描,主要扫描是否存在动态内存申请、释放,以及内存溢出等问题。
系统:Linux(麒麟V10)
平台:aarch64(鲲鹏)
asan下载和安装
rpm包下载
安装gcc编译器时一般是可以一并安装asan工具的。如果所在服务器没有安装asan工具,则可以寻找对应编译器版本的asan的rpm包进行安装。
项目使用的gcc为7.3.0,因此我们在下面的网站找到了7.3.0对应的asan工具rpm包:
https://update.cs2c.com.cn/NS/V10/V10SP3/os/adv/lic/base/aarch64/Packages
- libsasan-7.3.0-20220207.45.ky10.aarch64.rpm
- libsasan-static-7.3.0-20220207.45.ky10.aarch64.rpm
如果要更高级版本的rpm,可以在上面的地址上寻找。
rpm包安装
下载上面两个rpm包后,直接在rpm包所在路径下执行:
rpm -ivh *.rpm
安装后,在/usr/lib/gcc/aarch64-linux-gnu/7.3.0/下会找到libasan.a。
为啥不找libasan.so呢?因为如果使用动态库,就需要使用环境变量LD_PRELOAD,以确保libasan.so首先被加载。这样会导致设置后执行任何可执行程序都会进行预加载,包括linux指令。会使测试过程举步维艰 … …
因此后面我们使用libasan.a。
编译
必要的编译选项:
- “-static-libasan -fsanitize=address -fno-onit-frame-pointer”
- “-g”
环境变量
export ASAN_OPTIONS=halt_on_error=0:detect_leaks=1:log_path=../log/asan_err.log
- halt_on_error=0 防止执行过程中发现内存问题导致程序中断退出
- detect_leaks=1 检测内存泄漏
- log_path=…/log/asan_err.log asan的日志输出到…/log/asan_err.log中
程序退出
使用kill -2(Ctrl+C)退出程序,否则asan无法输出完整的检测结果日志。
程序结束后,即可查看…/log/asan_err.log日志。