当前位置: 首页 > article >正文

Sanitizers

一、简介

sanitizers 是谷歌提供的一套开源工具,能够发现堆栈读写溢出、内存泄漏、线程数据竞争和死锁等问题。包括:

  • AddressSanitizers (Asan):检测地址相关问题,如use-after-free,heap-buffer-overflow, stack_buffer_overflow,use_after_return, memory_leak等。编译选项:-fsanitize=address

  • LeakSanitizers (Lsan):检测内存泄漏。编译选项:-fsanitize=leak,gcc7以上已包含到-fsanitize=address中.

  • ThreadSanitizers (Tsan):检测数据竞争和死锁。编译选项:-fsanitize=thread, 不能与-fsanitize=address一起打开

  • MemorySanitizer: gcc不支持,暂时不管。

  • UndefinedBehaviorSanitizer (UBSan): 检测未定义行为。编译选项:-fsanitize=undefined

这些工具能帮助我们提前发现很多问题,保证代码鲁棒性。 注意:工具未发现问题不代表代码100%安全。

二、使用方式(以centos为例)

由于-fsanitize=thread, 不能与-fsanitize=address同时开启。所以完成代码检测需分别编译运行两次。

2.1 下载sanitizers相关库

如果当前环境gcc是通过下面的方式下载安装的:

yum install centos-release-scl -y
yum install devtoolset-7-gcc* -y
scl enable devtoolset-7 bash

那么需要安装对应的库,命令如下:

yum install devtoolset-7-libasan-devel
yum install devtoolset-7-liblsan-devel
yum install devtoolset-7-libtsan-devel
yum install devtoolset-7-libubsan-devel    中间的数字7对应gcc的版本。

如果gcc是通过源码包编译安装的,那么sanitizers的这些库默认被安装了,不用再额外下载。

2.2 使用Asan、Lsan、UBsan

CMakeLists.txt 加上: set(CMAKE_CXX_FLAGS "-fsanitize=address -fno-omit-frame-pointer -g -fsanitize=undefined"),并且设置CMAKE_BUILD_TYPEDebug ( Release 会默认加上-O3编译选项,会优化掉一些代码,可能导致一些错误检测不到) 。编译demo和算法库,然后运行即可。下面是笔者使用asan排查出代码泄漏问题和crash问题的报错截图:

2.2.1 mem leak

Sanitizers 会在程序退出时(如main函数结束时),打印出泄漏的大小和位置。因为只有我们自己的库增加了相关的编译选项,所有能显示出泄漏位置,其他三方库就只有泄漏的位置偏移.
在这里插入图片描述

2.2.2 segmentation fault

如果没有使用asan,出现的segmentation fault的堆栈是在curl 内部函数中,排查该问题就非常棘手:
在这里插入图片描述
使用asan后的打印信息:
在这里插入图片描述
明确显示是写越界,而且指出了写越界时的代码位置以及该内存分配时的代码位置,排查是写内存时的size问题还是内存分配时size问题即可。

2.3 使用Tsan

CMakeLists.txt 加上: set(CMAKE_CXX_FLAGS " -fno-omit-frame-pointer -g -fsanitize=thread"),并且设置CMAKE_BUILD_TYPEDebug.(Release 会默认加上-O3编译选项,会优化掉一些代码)。编译demo和算法库,然后运行即可。
示例代码:

#include  <thread>
#include  <iostream>
#include  <stdio.h>
using namespace std;
void test1(int& date){for(int i = 0; i < 5; i++){date++;}std::cout<<"test1"<<std::endl;
}
void test2(int& date){for(int i = 0; i < 5; i++){date++;}std::cout<<"test2"<< std::endl;
}
int main(){int a=0;std::thread thread1(test1, std::ref(a));std::thread thread2(test2, std::ref(a)); thread1.join();thread2.join();return 0;
}

报错截图:
在这里插入图片描述

三 功能简介

官方文档对每个点都有很详细的demo,可针对参考。

  • Use after free (dangling pointer dereference)

  • Heap buffer overflow

  • Stack buffer overflow

  • Global buffer overflow

  • Use after return Asan默认不会进行use-after-return 检测,需要设置ASAN_OPTIONS=detect_stack_use_after_return=1

  • Use after scope

  • Initialization order bugs

  • Memory leaks

  • UBSan

http://www.lryc.cn/news/2385054.html

相关文章:

  • pip代理出现问题 ProxyError
  • Ubuntu-多显示器黑屏问题及nvidia显卡驱动安装
  • vue+threeJS 创建镂空球体(SphereGeometry)
  • [ Qt ] | 常见控件(一)
  • 【八股战神篇】Java虚拟机(JVM)高频面试题
  • Pycharm-jupyternotebook不渲染
  • lanqiaoOJ 4330:欧拉函数模板
  • NDVI谐波拟合(基于GEE实现)
  • 《虚拟即真实:数字人驱动技术在React Native社交中的涅槃》
  • 南京邮电大学《智能控制技术》期末抢救(上)
  • Cookie、Session、JWT
  • TPDS-2014《Efficient $k$-means++ Approximation with MapReduce》
  • 地理特征类可视化图像
  • 【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案
  • DataGridView中拖放带有图片的Excel,实现数据批量导入
  • 跨域_Cross-origin resource sharing
  • Opencv常见学习链接(待分类补充)
  • 大疆制图跑飞马D2000的正射与三维模型
  • PostgreSQL中的权限管理简介
  • ConceptAttention:Diffusion Transformers learn highly interpretable features
  • 物联网低功耗保活协同优化方案:软硬件与WiFi网关动态联动
  • LW-CTrans:一种用于三维医学图像分割的轻量级CNN与Transformer混合网络|文献速递-深度学习医疗AI最新文献
  • 光谱相机在地质勘测中的应用
  • Autodl训练Faster-RCNN网络(自己的数据集)
  • 每日两道leetcode(今天开始刷基础题模块——这次是之前的修改版)
  • 服务器数据迁移终极指南:网站、数据库、邮件无缝迁移策略与工具实战 (2025)
  • NFS服务小实验
  • vue 中的v-once
  • 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面
  • 2025年开源大模型技术全景图