Sanitizers

news2025/5/25 3:12:07

一、简介

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.coloradmin.cn/o/2385054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pip代理出现问题 ProxyError

WARNING: Retrying (Retry(total4, connectNone, readNone, redirectNone, statusNone)) after connection broken by ‘ProxyError(‘Cannot connect to proxy.’, NewConnectionError(’<pip._vendor.urllib3.connection.HTTPSConnection object at 0x7f8347ad5ae0>: F…

vue+threeJS 创建镂空球体(SphereGeometry)

嗨&#xff0c;我是小路。今天主要和大家分享的主题是“vuethreeJS 创建镂空球体&#xff08;SphereGeometry&#xff09;”。 上次看到一个做镂空球体的项目&#xff0c;自己也准备尝试着做一做。今天终于做完了&#xff0c;并对这个项目进行梳理。 镂空球体示例效果…

[ Qt ] | 常见控件(一)

目录 Widget enable geometry 标题中的&#xff1a;有一不一定有二&#xff0c;但是有一说明还没结束。 Widget 控件(Widget)&#xff0c;是界面上各种元素&#xff0c;各种部分的统称。 Qt中的控件都是继承自QWidget这个类&#xff0c;是Qt控件体系中&#xff0c;通用的…

【八股战神篇】Java虚拟机(JVM)高频面试题

目录 专栏简介 一 请解释Java虚拟机(JVM)及其主要功能 延伸 1. JVM的基本概念 2. JVM的主要功能 二 对象创建的过程了解吗 延伸 1.Java 创建对象的四种常见方式 三 什么是双亲委派模型 延伸 1.双亲委派机制的作用: 2.双亲委派模型的核心思想: 3.双亲委派模型的…

NDVI谐波拟合(基于GEE实现)

在遥感影像中&#xff0c;我们常用 NDVI&#xff08;归一化植被指数&#xff09;来衡量地表植被的绿度。它简单直观&#xff0c;是生态监测、农情分析的基础工具。但你是否注意到&#xff1a; NDVI 虽然“绿”&#xff0c;却常常“乱”。 因为云层、观测频率、天气干扰&#xf…

南京邮电大学《智能控制技术》期末抢救(上)

一、智能控制的提出 传统控制方法包括经典控制和现代控制——基于被控对象精确模型的控制方式&#xff0c;缺乏灵活性和应变能力&#xff0c;适于解决线性、时不变性等相对简单的控制问题。传统控制方法在实际应用中遇到很多难解决的问题&#xff0c;主要表现以下几点&#xff…

TPDS-2014《Efficient $k$-means++ Approximation with MapReduce》

推荐深蓝学院的《深度神经网络加速&#xff1a;cuDNN 与 TensorRT》&#xff0c;课程面向就业&#xff0c;细致讲解CUDA运算的理论支撑与实践&#xff0c;学完可以系统化掌握CUDA基础编程知识以及TensorRT实战&#xff0c;并且能够利用GPU开发高性能、高并发的软件系统&#xf…

地理特征类可视化图像

目录 一、蜂窝热力地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.python代码实现 (1)代码 (2)实现结果 二、变形地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.python代码实现 (1)代码 (2)实现结果 三、关联地图 1. 特点 (1)优点 (2)缺点 2. 应用场景 3.pyth…

【Java高阶面经:微服务篇】8.高可用全链路治理:第三方接口不稳定的全场景解决方案

一、第三方接口治理的核心挑战与架构设计 1.1 不稳定接口的典型特征 维度表现影响范围响应时间P99超过2秒,波动幅度大(如100ms~5s)导致前端超时,用户体验恶化错误率随机返回5xx/429,日均故障3次以上核心业务流程中断,交易失败率上升协议不一致多版本API共存,字段定义不…

DataGridView中拖放带有图片的Excel,实现数据批量导入

1、带有DataGridView的窗体&#xff0c;界面如下 2、编写DataGridView支持拖放的代码 Private Sub DataGridView1_DragEnter(ByVal sender As Object, ByVal e As DragEventArgs) Handles DataGridView1.DragEnterIf e.Data.GetDataPresent(DataFormats.FileDrop) ThenDim file…

跨域_Cross-origin resource sharing

同源是指"协议域名端口"三者相同&#xff0c;即便两个不同的域名指向同一个ip,也非同源 1.什么是CORS? CORS是一个W3C标准&#xff0c;全称是"跨域资源共享"&#xff08;Cross-origin resource sharing&#xff09;。它允许浏览器向跨源服务器&#xff…

Opencv常见学习链接(待分类补充)

文章目录 1.常见学习链接 1.常见学习链接 1.Opencv中文官方文档 2.Opencv C图像处理&#xff1a;矩阵Mat 随机数RNG 计算耗时 鼠标事件 3.Opencv C图像处理&#xff1a;亮度对比度饱和度高光暖色调阴影漫画效果白平衡浮雕羽化锐化颗粒感 4.OpenCV —— 频率域滤波&#xff…

大疆制图跑飞马D2000的正射与三维模型

1 问题描述 大疆制图在跑大疆无人机飞的影像的时候&#xff0c;能够自动识别相机参数并且影像自带pos信息&#xff0c;但是用飞马无人机获取的影像pos信息与影像是分开的&#xff08;飞马无人机数据处理有讲&#xff09;&#xff0c;所以在用大疆制图时需要对相机参数进行设置…

ConceptAttention:Diffusion Transformers learn highly interpretable features

ConceptAttention: Diffusion Transformers Learn Highly Interpretable Featureshttps://arxiv.org/html/2502.04320?_immersive_translate_auto_translate=1用flux的attention来做图文的显著性分析。 1.i

物联网低功耗保活协同优化方案:软硬件与WiFi网关动态联动

目录 一、总体方案概述 二、架构组成 2.1 系统拓扑 2.2 硬件端(MCU + WiFi 模组) 2.3 WiFi 网关 2.4 云端服务器 三、低功耗保活技术设计模式 3.1 模式一:定时唤醒 + MQTT 保活 3.1.1 设备端 3.1.2 优势 3.2 模式二:网关保活代理 + 本地网络唤醒 3.2.1 网关功能…

LW-CTrans:一种用于三维医学图像分割的轻量级CNN与Transformer混合网络|文献速递-深度学习医疗AI最新文献

Title 题目 LW-CTrans: A lightweight hybrid network of CNN and Transformer for 3Dmedical image segmentation LW-CTrans&#xff1a;一种用于三维医学图像分割的轻量级CNN与Transformer混合网络 01 文献速递介绍 三维医学图像分割旨在从计算机断层扫描&#xff08;CT…

光谱相机在地质勘测中的应用

一、‌矿物识别与蚀变带分析‌ ‌光谱特征捕捉‌ 通过可见光至近红外&#xff08;400-1000nm&#xff09;的高光谱分辨率&#xff08;可达3.5nm&#xff09;&#xff0c;精确识别矿物的“光谱指纹”。例如&#xff1a; ‌铜矿‌&#xff1a;在400-500nm波段反射率显著低于围…

Autodl训练Faster-RCNN网络(自己的数据集)

参考文章&#xff1a; Autodl服务器中Faster-rcnn(jwyang)复现(一)_autodl faster rcnn-CSDN博客 Autodl服务器中Faster-rcnn(jwyang)训练自己数据集(二)_faster rcnn autodl-CSDN博客 环境配置 我到下载torch这一步老是即将结束的时候自动结束进程&#xff0c;所以还是自己…

NFS服务小实验

实验1 建立NFS服务器&#xff0c;使的客户端顺序共享数据 第一步&#xff1a;服务端及客户端的准备工作 # 恢复快照 [rootserver ~]# setenforce 0 ​ [rootserver ~]# systemctl stop firewalld ​ [rootserver ~]# yum install nfs-utils -y # 服务端及客户端都安装 …

鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面

发请求展示新闻列表 鸿蒙ArkTS-发请求第三方接口显示实时新闻列表页面 1. 效果图 新闻首页&#xff1a; 点击某一新闻的详情页面&#xff08;需要使用模拟器才能查看详情页面&#xff09;&#xff1a; 2. 代码 1. key准备 首先需求到聚合网申请一个key&#xff0c;网址如下…