意图:检查源代码中是否存在某些地址,在free掉之后还对其进行了访问。
1, 示例远代码
cat hello_sani.cpp
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
int i = 1;
int *A = new int[12];
cout <<"newed A &A[0]="<<&A[0]<<" &A[1]="<<&A[1]<<endl;
delete [] A;
cout<<"deleted A"<<endl;
A[i]=1; // =1
cout<<"check point "<<A[i]<<endl;
A[i] = A[i] + 1; // =2
cout<< "check point "<<A[i]<<endl;
A[i]=3; // =3
cout<<"check point "<<A[i]<<endl;
return 0;
}
Makefie
hello_sani:
%: %.cp
clang++ -g -O -fsanitize=address $< -o $@
%: %.cpp
clang++ -g -O -o $@ $<
.PHONY: clean
clean:
rm -rf hello_sani
2, 编译运行效果
2.1 带 use after free 检查
编译命令:
clang++ -g -O -fsanitize=address $< -o $@
带 use after free 检查的运行效果,其中的错误提示看图:
2.2不 带 use after free 检查
编译命令:
clang++ -g -O $< -o $@
不带 use after free 检查的运行效果:
3,应用场景
可以在 Makefile 中加一个编译命令控制
ifeq (SAN 1)
SAN_FLAGS := -fsanitize=address
else
SAN_FLAGS :=
endif
%.o: %.cpp
clang++ -g -O $(SAN_FLAGS) $< -o $@
具体编译:
不做 sani check 时的构建:
$ make
做 sani check 时 的构建:
$ make SAN=1