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

STM32H750_QSPI_Flash_Configuration_With_CubeMX

本文详细介绍了如何使用STM32CubeMX配置STM32H750的QSPI Flash接口,包括硬件连接、CubeMX参数设置、代码生成与初始化流程优化。通过实战示例展示了Flash ID读取、页编程与数据读取等常用操作,并提供了调试技巧与性能优化建议,帮助开发者高效实现高速外部存储扩展。

weixin_29176179的博客 273

中山大学_数据科学与计算机_预推免

前言 2019 年 9 月中旬是中山大学预推免时间,本人没能进到夏令营,但是最后在预推免上岸也算不幸中的万幸。 记忆不一定准确,但希望能帮到他人。 想看 流程 的可以直接看总结,正文部分有本人心路历程。 预推免 中山大学的预推免大致可以分为 报道,机试,面试 三大部分,而且尤其是面试,所有人加起来总时长 3 天,幸运的是,本人被安排在第一天的下午第一场,上午就是机试,报道,机试,面试,无缝衔接。 ...

一把健 5208

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

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

LogicPlex的博客 1056

操作系统原理:【优麒麟】linux内核添加系统调用

在底端添加如下代码。

Joyce_zz的博客 2709

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

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

weixin_28746457的博客 499

手把手教你用srec_cat生成带CRC校验的STM32固件(解决OTA常见校验失败问题)

本文针对STM32 OTA升级中常见的固件校验失败问题,提供了一套使用srec_cat工具自动生成带CRC32校验固件的实战解决方案。文章详细拆解了命令参数,指导开发者如何为固件嵌入CRC值、处理地址偏移及合并文件,从而确保Bootloader能可靠校验固件完整性,提升远程更新的稳定性。

kappa的博客 783

ESP32系列之LVGL(四):输入设备(外部按键)对接

本文详细介绍了如何在ESP32上使用LVGL库对接外部按键作为输入设备,包括硬件连接、驱动层实现和LVGL输入设备移植。通过具体代码示例和实战案例,帮助开发者快速实现按键控制UI界面,解决常见问题如按键无反应和控件跳转不正常。

weixin_30907935的博客 241

深入研究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

QT日志输出终极指南:从qDebug到qFatal的完整文件记录方案

本文深入探讨了QT日志系统的企业级文件记录方案,从基础的qDebug、qWarning、qCritical、qFatal等宏的使用,到构建自定义消息处理器、实现异步写入、分级存储、日志轮转及性能监控等高级功能。旨在帮助开发者构建一个稳定、高效且易于维护的专业级日志管理架构,适用于桌面应用、嵌入式系统及服务端程序。

ik678901234的博客 909

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

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

beswkwangbo的专栏 1万+

【2023校招】网易雷火_研发岗_笔试题解

几个月没写题,果然水平不在线了hh,AK更难实现喽,当天只AK了疯狂游戏; 题目描述和数据等尽量多的CV到了DEVC里,可能不够细节和准确; 下面进入正题,分享我们此次笔试的题目描述和代码设计吧~.........

米莱虾 4544

视觉-语言模型:BLIP与Flamingo如何理解图文?

视觉-语言模型:BLIP与Flamingo如何理解图文? ,人工智能,计算机视觉,大模型,AI,在当今人工智能飞速发展的时代,视觉 - 语言模型作为多模态领域的关键技术,正逐渐改变着我们与数字世界交互的方式。它们致力于打破图像与文本之间的模态壁垒,使计算机能够像人类一样,综合理解和处理视觉与语言信息。其中,BLIP 和 Flamingo 两款模型脱颖而出,以独特的架构和创新的训练方法,在图像描述生成、视觉问答、图文检索等任务中展现出卓越的性能。本文将深入剖析 BLIP 与 Flamingo 模型的工作原理。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4万+

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

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

修复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、付费专栏及课程。

余额充值