LWN: 改进GCC的 -fanalyzer 选项!

Clang Static Analyzer 系列(一)编译 Clang 及运行 Checker Clang Static Analyzer 实践系列(一),包含如何编译 Clang 、打印 AST CFG CallGraph ExplodedGraph 等信息以及运行 Checker 检查代码。 阅读详情

关注了就能看到更多这么棒的文章哦~

Improvements to GCC's -fanalyzer option

By Jonathan Corbet
September 23, 2021
LPC
DeepL assisted translation
https://lwn.net/Articles/869880/

GNU Tools Cauldron(GNU 工具链开发者的年度聚会)已经是连续第二年在 Linux Plumbers 在线大会上作为一个专门 track 来进行了。在 2021 年的会议上,David Malcolm 首先介绍了 GCC -fanalyzer 选项相关的工作,该选项提供了一些静态分析功能。在 -fanalyzer 这一个领域已经有了很多进展,而且在即将发布的 GCC 12 版本中还会有更多的功能,包括增加的一系列检查可能已经发现内核中的若干漏洞了。

c0eaa7a8af1234c8c23185ec9f9fd104.png

GCC 在被调用时如果带有 -fanalyzer 选项的话,它会运行一个 module 来创建一个 "爆炸图,exploded graph",可以将程序的控制流和数据流的状态信息结合在一起显示出来。其包括对内存内容的抽象描述、对变量值的已知限制、以及代码是不是可能正在 signal handler 中运行等等信息。然后,analyzer 就可以使用这个图来尝试探索代码中所有感兴趣的路径,看看可能会发生什么。

GCC 10 版本中,针对潜在错误方面已经新增了 15 个 warning 信息,如两次释放内存、释放内存后继续使用、signal handler 程序中不安全的函数调用、可能在将敏感数据写入日志文件等等。两次释放的检测正是让人们有动力开发这些检查功能的主要因素。GCC 11 中又增加了五个 warning,包括可以检查出从一个 allocator 中获得的内存是否被意外地释放到另一个 allocator 中了,以及对位移运算中一些未定义行为的检查。GCC 11 中还支持使用插件来扩展 analyzer。在 test suite 里面就可以找到一个插件样例,用于检查出 Python 全局解释器锁(GIL)的错误使用。

最近,Malcolm 在思考针对 GCC 12 应该做些什么。他原本想增加对 C++ 的支持,但后来发现他自己更愿意改进 C 语言相关的功能。在得出这个结论之前,他已经在 GCC 11 中实现了 new 和 delete 的支持,并把异常处理(exception handling)作为了他自己的下一个目标,但结果发现这个领域 "相当复杂"。同时,谷歌夏季代码挑战项目的学生 Ankur Saini 也增加了对虚拟函数的支持。因此,C++ 这方面已经取得了一些进展,但 Malcolm 的工作目前将继续集中在 C 语言上。

有几个 C 语言的问题引起了他的注意,其中之一是缓冲区溢出的检测。他实现了一个原型方案,可以根据 symbol 捕捉记录动态分配的 size,并在后续读写时可能超出这个 size 的时候给出 diagnostics 诊断信息。但是很难确定应该在什么时候来报出 warning,现有代码中产生了太多的误报(他的说法是 "a wall of noise"),因此无法真正实用起来。

不过,他想到有一种方法可能可以找到一类特定的问题:就是针对那些可能被攻击者影响某次 access 是否有效的位置。这就引出了 taint detection(污染检测)以及如何确定程序中的信任边界(trust boundaries)在哪里的问题。要想对随便一段 C 代码来确认这两点,这会是一个非常困难的问题。不过,针对特定程序的话,是可以进行标注(annotate)并获得有用的诊断信息。他的注意力转向了内核,因为内核具有一个定义非常明确的信任边界,以及一个用来跨越该边界进行数据搬移的 API。通过对 copy_from_user() 以及 system-call handler 函数的标注,就可能可以发现那些没有对用户所提供的数据进行检查(sanitize)的代码。

GCC 有一个属性(access),用来描述数据是如何在某个的变量或函数中移动的。Malcolm 为该属性增加了两个新的可用值(untrusted_read 和 untrusted_write),用来标记读取来自于(或写入目标是)一个不受信任的位置的数据。因此,比如通过 copy_from_user() 读入内核的数据就会被标记为 untrusted_read。他还为这些函数添加了一个新的 tainted 属性,用来表示该函数的所有参数都应被视为不可信任的。通过修改内核头文件中的一个宏,他就能够将内核中所有的 system-call handler 函数都打上这个 tainted 属性。也可以对其他一些函数进行类似标记,比如说内核生成的文件系统的 callback 函数。

有了这些标注之后,analyzer 就可以检测到两类问题:信息泄露(information leaks)和使用了污染数据(tainted data)。信息泄露都是发生在将未进行初始化的数据直接写回到用户空间的时候。这种情况相对比较容易检测,或者至少他是这样认为的。作为这类问题的一个例子,Malcolm 提出了 CVE-2017-18549,这是一个将 stack 中的随机数据写回用户空间的驱动程序 bug。在这种情况下,被写入的这个未进行初始化的数据是在一个原本被正常进行了初始化的结构中填入的 padding 数据,analyzer 就可以发现这个问题。要让这个问题得到 fix,需要对未初始化数据的跟踪记录代码进行重构,这不是一个容易的任务。

还有一个类似的问题,是从用户空间读取数据进行修改,然后把结果 copy 回用户空间,也许是 copy 到另一个位置。如果 read 操作失败了的话,内核可能会对未初始化的数据进行一些处理然后直接写入用户空间。要 fix 这个问题,需要对处理 copy_from_user()失败的情况。一旦完成了这个工作之后,analyzer 也就可以处理 realloc() 了,尽管它有三种可能结果。

当用户提供的数据被拿来当作数组的索引时,就会出现数据被污损(tainted)的情况。这种情况更难检测,但似乎更重要一些,因为这种类型的漏洞往往可以被利用来攻破内核。例如 CVE-2011-0521 这种情况下,内核代码会读取一个有符号的 "size" 值,根据所允许的最大值来进行检查,但是没有检查是不是负数就直接使用它了。改进后的 analyzer 就能够捕捉到这种情况。

他仍在研究如何实现这个功能的原型,期待可以展示给大家看。作为这个工作的一部分,他开发了一个世界上的最糟糕的内核 module,其中包含了他能想到的所有问题。不过,由于内核使用了大量的 inline 汇编代码,这使得 analyzer 要做的事情在分析完整内核的情况下就变得更加复杂。他已经为这个功能添加了一些基本的处理代码,但是目前并没有去检查实际的汇编操作码(opcodes)。

他一直在针对 upstream 的内核来不断运行自己的检查功能,并且已经发现了一个真正的漏洞,这个漏洞已经被报告出来但是尚未被修复或披露出来。因此,Malcolm 的最新成果代码仍然只能放在在公司内部的代码仓库中。因为它发现了真正的系统漏洞,那么在它所发现的问题被修复之前,他可不想把工具发布出来成为帮助攻击者的 zero-day-finding 工具。其他大部分工作现在都提交到 GCC 12 的主分支中了。他希望能够在 GCC 12 stage 1 周期结束前就完成这项工作并将其推到 upstream(https://gcc.gnu.org/develop.html 这里可以看到 GCC 开发周期的各个 stage 的含义)。

关于这个项目的更多信息可以在 GCC wiki (https://gcc.gnu.org/wiki/DavidMalcolm/StaticAnalyzer) 中找到。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

9ad7b9b4be9f5e07339cbd60266161f7.png

gcc自带sanitizer工具使用 Sanitizers是谷歌发起的开源工具集,包括了AddressSanitizer, MemorySanitizer, ThreadSanitizer, LeakSanitizer,Sanitizers项目本是LLVM项目的一部分,但GNU也将该系列工具加入到了自家的GCC编译器中。GCC从4.8版本开始逐步支持 Sanitizer,这些工具都是查找隐藏Bug的利器。 AddressSanitizer可用于检测 memory out-of-bounds 和 use-after-free。 Address 阅读详情

相关推荐

GCC(GNU Compiler Collection)与人工智能实例

GCC与AI技术的融合创新 本文系统梳理了GCC编译器与人工智能技术结合的25个典型应用场景,涵盖编译器优化、AI模型部署、代码生成等多个领域。在编译器优化方面,AI技术可辅助GCC实现机器学习驱动的编译优化、自动向量化决策、分支预测优化等关键功能;在AI模型部署环节,GCC可用于ONNX模型推理加速、TensorFlow Lite微控制器部署等任务;在代码生成领域,AI技术能与GCC的静态分析结合,实现智能代码补全、漏洞检测等功能。文章还详细介绍了AutoTVM与GCC集成的具体案例,展示了如何通过参数搜

keny-大成的博客 1228

代码质量优化之静态代码扫描

质量是保证产品和服务满足顾客需求的关键,真正的好产品,是能以用户为中心,和用户做朋友的。作为开发人员,除了保证产品基础功能正常外,还要保证高标准的代码质量。代码质量可以从代码的严谨性、可读性、可维护性、健壮性、性能和效率、代码覆盖度、易测性、可移植性几个方面的评价。严谨性:指的是逻辑严谨,代码逻辑要符合运行预期。在这一环节,要避免内存泄漏、句柄泄漏、使用恰到的同步\异步机制等。好的代码质量,在某段代码指令执行后,会产生什么样的动作、内存功耗占用多少都是要符合预期的。

linchuanzhi_886的专栏 2743

Pandas入门教程(二十二):股票数据分析实战——yfinance 获取数据、技术指标与收益率分析

把 Pandas 用在真实场景,才能体会它的价值。本文以茅台股票为例,用 yfinance 获取历史行情,完成缺失值处理与列筛选,绘制收盘价曲线,计算 SMA 移动平均线与 RSI 相对强弱指数,并通过日收益率、累计收益率和波动率完成完整的量化分析流程。

Smell_of_earth的博客 301

2023-07-03 gcc内存检测参数-fsanitize的使用和说明

在linux服务器中, 除了使用valgrind在程序运行时对程序的内存使用做检测, 过滤出内存泄漏. 还可以在gcc的参数上添加-fsanitize并链接libasan库, 这样在程序因为内存问题崩溃后会直接得到直观的信息。本文做简单的记录。

悟世之路 1164

APM32F103 配置CAN

摘要: 本文介绍了基于APM32F103RCT6的CAN通信实现,包含GPIO初始化、CAN配置、数据收发功能。通过配置CAN1的GPIO引脚(PB8/PB9)和波特率(500Kbps),实现标准帧格式的数据传输。发送函数支持8字节数据包,接收函数通过FIFO0处理消息,并根据接收ID触发响应发送(如ID 0x1回复0x2)。代码还包含错误状态检测(如总线关闭处理)和过滤器配置(32位掩码模式)。整体实现了基础的CAN通信与错误管理功能。

weixin_43676660的博客 862

信贷风控分析—征信数据源

详解企业和个人征信报告,以及信贷风控之指标构造案例参考

csdnbt的博客 3626

【Clang静态分析深度指南】:3大核心技巧解读分析结果,提升代码质量

掌握Clang静态分析结果解读方法,快速定位代码缺陷。适用于C/C++项目质量提升,详解3大核心技巧:警告分类、路径追踪与误报识别,精准识别内存泄漏与空指针风险。提升代码可靠性,团队开发更高效,值得收藏。

LogicPlex的博客 1056

Oracle数据库安装图文教程 附百度云oracle Database 11g 安装包

一,Oracle数据库安装包下载 1.从Oracle官网下载所需的数据库安装包【下载需要注册登录Oracle账户】     http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html 2.此处有下载好的Oracle Database 11g Release 2  百度云网盘  提取码:z...

向来如此,就一定是对的吗 6万+

linux gcc的作用,GCC新的静态分析功能正在为GCC 10准备就绪

在大约一个月的时间内发布的GCC 10代码编译器中的许多新功能之一终于有了内置的静态分析器。可以使用-fanalyzer开关启用此静态分析器,并且其初始功能在GNU Compiler Collection 10中已经很好地成熟了。一月份,静态分析器就被添加到了GCC 10中,最初的重点是C代码。这款用于GCC的静态分析仪由GCC的David Malcolm牵头,并在几个月前以补丁形式提供。这种静态...

weixin_28746457的博客 499

实战指南:在摩尔线程GPU上部署AI模型的完整流程

本文提供了一份详尽的实战指南,手把手教你如何在摩尔线程GPU上成功部署AI模型。内容涵盖从驱动安装、Docker环境配置,到核心的代码适配与模型运行全流程,并分享了性能调优技巧与常见避坑方法,旨在帮助开发者高效利用国产硬件进行AI应用开发。

weixin_29271263的博客 537

QT邂逅豆包API:打造专属文章生成神器

通过本次探索,我们成功基于 QT 调用豆包 API 开发出了文章生成工具。从前期的准备工作,到核心代码的实现,再到功能的拓展与优化,每一步都凝聚着技术的魅力与挑战。我们学会了申请豆包 API 密钥,搭建 QT 开发环境,创建网络请求类来与豆包 API 进行交互,构建请求体并解析响应,还为工具添加了友好的界面交互,提升了性能。

大雨淅淅的博客 1971

深入研究Clang(十) Clang Static Analyzer简介

Clang Static Analyzer 官网地址:http://clang-analyzer.llvm.org/Clang Static Analyer是一个源码分析工具,它可以发现C、C++和Objective-C程序中的bug。现在Clang Static Analyer既可以作为一个单独的工具使用,也可以集成在Xcode中使用。作为单独的工具使用的时候,可以通过命令行调用,作为一个代码库

SHINING的博客 9005

YOLOv8安防监控实战:跌倒/闯入/徘徊实时检测(附TensorRT加速+声光报警部署代码)

精准性:针对跌倒/闯入/徘徊的行为特征优化,准确率达89.3%,误报率低于5次/天;实时性:TensorRT加速到50+FPS,报警延迟<1秒,满足安防“黄金响应时间”;低成本:无需专用AI芯片,RTX 3060或Jetson Orin就能跑,硬件成本比传统方案低60%;易部署:代码全开源,提供从模型训练到硬件联动的完整流程,2天即可搭起原型系统。如果你的安防监控还在“漏报误报”“响应慢”,建议先从跌倒检测的姿态过滤改起——用100张样本测试,再集成TensorRT加速,90%能看到明显改善。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 678

Clang 静态分析(Static Analyzer)工具使用的总结

woogle原创,转载注明出处。 Clang作为LLVM(LowLevel VirtualMachine)编译器框架的前端,可以将C/C++、O-C/O-C++语言编译成为LLVM的中间表达式IR(IntermediateReresentation), 其结构图如下所示:​ 上面的不是重点,本篇文章的重点是讲Clang静态分析工具的使用,Clang作为前端,最主要的

beswkwangbo的专栏 1万+

避坑指南!YOLO26模型导出/推理常见问题,99%的开发者都踩过

版本锁定:Ultralytics=8.4.2、OpenVINO=2024.0.0、Python=3.10,版本不一致是80%问题的根源;参数对齐:训练/导出/推理的imgsz、归一化、坐标映射必须完全一致,差一步就出错;算子统一:避免自定义算子,优先用YOLO26原生算子(C3k2/PSABlock),确保推理引擎兼容;分步验证:导出后先校验ONNX/IR模型→单图片推理→RTSP流推理→72小时稳定性测试,一步过易踩坑;工业级测试。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 510

微信小程序、H5微信公众号网页JSAPI:解决报错requestMerchantTransfer:fail:internal error(使用wx.requestMerchantTransfer错误)

如何解决requestMerchantTransfer:fail:internal error,微信小程序wx.requestMerchantTransfer报错,微信公众号H5网页使用jssdk调用wx.requestMerchantTransfer报错,JSAPI调起用户确认收款报错errMsg:“requestMerchantTransfer:fail:internal error“,微信小程序/H5 调起确认收款界面,JSAPI调起用户确认收款,微信公众号(H5),用户发起提现,商家转账给用户,用户

✅ 精选推荐文章 4963

GCC 11 的静态分析功能将得到增强

在 GCC 10 中,状态跟踪组件存在很多崩溃错误,其中一个大问题是使用唯一 ID 来跟踪符号值和区域,目前修改为使用唯一对象(单例)来表示符号值和区域。另一个大问题是之前的实现中,符号值和区域被用来表示内存区域的符号访问路径到符号值的映射,目前修改为内存中位偏移群集的映射。 GCC 10 中的内存泄漏检测存在很多误报,并且分析器的确切行为因调用而异,由于哈希算法,迭代的顺序将隐式取决于精确的指针值。指针值可能由于地址空间布局随机化而不同,从而导致不同的结果。该部分内容已经重写,新的内存泄漏检测将更少误报,

哦,原来你也在这里。 8299

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

5、Analyzer分析器

1.1Analyzer使用时机1.1.1    索引时使用Analyzer         输入关键字进行搜索,当需要让该关键字与文档域内容所包含的词进行匹配时需要对文档域内容进行分析,需要经过Analyzer分析器处理生成语汇单元(Token)。分析器分析的对象是文档中的Field域。当Field的属性tokenized(是否分词)为true时会对Field值进行分析,如下图: 对于一些Fiel...

u013115157的博客 5321

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

修复Coverity静态检查工具发现的代码缺陷

coverity介绍 静态源代码分析允许我们在软件开发周期的早期阶段发现和修复缺陷,节省数以百万计的相关成本。 coverity常见软件缺陷修复方法 对于一些不知道修复的缺陷,通过http://cwe.mitre.org/data/index.html网址输入id,查找该缺陷的具体含义,并找到解决方法。 总结 未完,待续…… ...

weixin_43722423的博客 8005

AI全栈实战 | 3.9-01 爬虫入门:requests 加 BeautifulSoup 三分钟跑通,但 90% 的人栽在这 4 个“礼貌“问题上

⚠️:本文内容仅用于。请遵守目标站点的服务条款与相关法律法规,不得对目标服务造成负担,不得采集、传播个人隐私数据。技术是中性的,边界在你手里。爬虫的入门技术(requests 发请求 + BeautifulSoup 解析)三分钟就能学会。真正区分"会用爬虫"和"会做爬虫的人"的,是这篇我们跑通"请求→解析→存储"的最小闭环,然后重点把"合规与礼貌"这根弦给你绷上。

源码获取 | 运行部署 | 定制二开修改,如果回复不及时请耐心等待,请见谅。 392

从一段视频到可漫游的 4D 有声场景:思路拆解与最小复现手记

只需一段手机视频,你就能生成可"走进去"的 4D 有声场景:转头时狗叫声方向随之变化,走近时声音更清晰。本文拆解 Video-to-4DAVScene 的核心思路,手把手带你用几十行 Python 搭出最小管线,把视频中的运动物体变成带空间位置的声源,并附上三个真实踩坑的排障经验,代码可直接跑。🎧

helloagent的博客 229

Python+Agent入门笔记(二):列表推导式、模块和异常,这些写 Agent 前得会

接上一篇《Python+Agent入门笔记(一)》。基础语法跑通之后,这篇聊几块日常写脚本绕不开的东西。还是按 JS/Go 开发者的视角写,尽量记录我实际卡过的地方。

qq_41241612的博客 430

详解Python条件语句

在 Python 中,if...else 是一种条件语句,可以根据给定的条件执行不同的操作。这个语句通常用于控制程序的流程。

2601_96798737的博客 205

微调数据集构建:清洗、标注、格式转换完整流程

摘要解决微调数据直接抓取导致的噪声污染、模式崩溃与Token错位问题。适用于需为大模型SFT阶段构建高质量训练集的数据与算法工程师。读完可获得包含启发式清洗、MinHash去重及ChatML格式对齐的完整可运行数据流水线。关键词数据清洗、MinHash去重、数据标注、ChatML、SFT数据集、数据配比背景与问题大模型微调效果的上限由数据质量决定,直接使用未经处理的原始语料极易引发模型复读、幻觉与指令遵循能力退化。

2402_85729970的博客 487

Python3 协程:异步编程的核心机制与实战

协程是解决I/O密集型任务等待瓶颈的高效机制,相比线程更轻量、无锁开销。从yield到async/await的演进,使异步编程语义清晰、易于理解。通过async/await可实现并发执行多个任务(如gather、create_task),显著提升网络请求、爬虫等场景性能。关键在于使用异步库(如aiohttp)替代同步库,避免阻塞事件循环。合理控制超时与并发数,才能发挥协程最大优势。

Lxn2zh的博客 159

python如何控制浏览器

Python 可以通过 Selenium、Playwright 等工具实现浏览器自动化,从打开网页到执行复杂交互操作均可脚本化完成。Selenium生态成熟

2601_96797912的博客 76
上一篇: LWN: Linux kernel 中的Rust!
下一篇: LWN:GCC 中两个安全相关的改进!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值