C++ 编译器中对 use after free 的检查示例

本文介绍了如何在C++代码中检查是否在释放内存后仍对其进行访问,使用地址sanitizer工具进行编译,并在Makefile中设置条件来控制是否启用内存安全检查。通过示例展示了带和不带内存安全检查的编译及运行结果。
摘要由CSDN通过智能技术生成

意图:检查源代码中是否存在某些地址,在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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值