LWN: 针对GCC的静态分析框架!

CLIP-Count代码配置以及踩坑记录 阅读详情

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

A static-analysis framework for GCC

By Jake Edge
December 4, 2019

原文来自:https://lwn.net/Articles/806099/

GCC比起Clang/LLVM编译器来说其实在某一方面一直比较弱,不过很快就能补上了。在11月中旬,David Malcolm发到gcc-patches mailing list的邮件,介绍了他写的一个针对GCC的全新的静态分析架构(static-analysis framework)。这可能标志着针对GCC编译器的一系列代码分析功能的开始。

在这封很长的邮件里面,有介绍这个静态分析工具会是基于GIMPLE static single assignment (SSA) intermediate representation(静态单赋值中间表示)的一轮interprocedural analysis (IPA,过程间分析)。它用到了状态机来代表所在解析的代码,这个分析过程会寻找发生一些错误的状态转换的情景。这种状态转换就表明应该弹出warning信息提醒用户这里可能代码有问题。

这个patch set里面增加了两种独立的检查器(checker):malloc()指针跟踪,以及检查通过stdio使用FILE * API的时候是否有问题。还有一些其他的概念验证性的状态机:一个是跟踪敏感信息的,例如password密码,需要想办法避免泄露到log文件里;另一个是跟踪可能被篡改了的输入数据避免用在数组下标上(避免数组越界访问)。

这个malloc()状态机在sm-malloc.cc中实现的,它会检查是否有那些常见的错用了malloc()返回的指针的问题,例如重复释放(double free)、空指针引用(null dereference)、针对一个非heap的指针调用了free()等等。类似地也有另一个patch增加了sm-file.c用来检查FILE *问题,主要是查看是否有多次调用fclose()或者是否close文件的时候出错了。

这些诊断性输出信息的处理,需要一些额外功能来支持这些新的warning类型。例如,为了能提供更加易懂的warning信息,就需要确定出来导致这个问题的代码路径并且保存好。这个信息会和warning信息以及代码位置(行号以及行内偏移)一起被记录下来,这样就可以被编译器展示出来。patch的介绍邮件里面还有一些例子,也提供了链接可以让人看到一些彩色的输出例子,例如下图。

除此之外,Malcolm还扩展了诊断工具,可以允许在warning信息这里增加更多的附属信息(metadata)。具体来说,它把这些信息跟Common Weakness Enumeration (CWE) list关联了起来,当然也可以关联其他类型的metadata。在支持CWE的终端terminal里面,CWE编号会是一个可以点击的链接,能跳转到这个条目对应的网页上,例如:https://cwe.mitre.org/data/definitions/690.html 

分析的过程是通过传递--analyzer命令行参数来触发的,还有一些参数能打开或关闭具体的某一类warning信息。目前这个功能是实现为GCC的"in-tree"插件的,也就是会随着GCC本身分发出去。不过Richard Biener建议最好直接把分析器编译到GCC里面去,当然可以有一个配置选项来选择关闭它。他还提到可以考虑重写GCC插件API,是否能让插件跟GCC和LLVM都可以配合工作。不过这肯定会需要更长时间来实现了。

Malcolm说,他实现成插件API,主要是因为认为目前代码还不成熟:“我这样实现的原因,是因为分析器还是一个中端(middle-end)代码,不过不如其他的中端代码成熟,当然我会继续改进的。我希望能有什么方法把这个代码标记成technology preview的状态,这样人们就可能愿意来体验一下了,同时也能有意识认识到这里可能会有bug,只不过早点提供出来大家可以先试试。......我采用in-tree插件的方式,是因为看到一些类似的前端(frontend),不过确实如果编译进GCC的话会更简单一些,通过编译时的配置来选择。这里有几千行C++代码,不算小了,并且也有相关的selftests和DejaGnu测试。”

目前来说,这个分析器的代码大概导致GCC代码增加了2.5%。不过Jakub Jelinek和Biener还是更倾向于直接编译进GCC。Malcolm看起来也挺乐意,所以不久后应该会切换进来。同时,他还提交了一个更新版本的patch set,主要是修复一些编译时优化(LTO, link-time optimization)的兼容性问题。

Patch的描述邮件最开始的Rationale小节里面,介绍了这个分析器的动机以及目标:“如果在编译器里面集成一个检查器,会有不少好处,开发者就能在开发代码的时候看到这些诊断信息了,而不是在后面的阶段。我认为,如果分析器运行得足够快的话,大家可能会更愿意利用起来拿到更多更深入但是也更耗时的warning信息。(我预计会在2倍左右的编译时间,因为我感觉这个代价比起面对各种指针混乱等bug来说还是比较值得的。)”

总的来说,目前大家的反馈还比较正面。已经有不少code review意见了。正如Eric Gallager所说,过去多年来一直有用户要求增加一些warning信息,而这个分析器能够对此有帮助。目前来看,GCC的这个缺失功能是会慢慢补上了。希望几年内,--analyzer能够在自由软件领域里面广泛应用起来。这样肯定会帮咱们的项目产生更好的代码。

全文完

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

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

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

图像质量评估和点云质量评估 本文介绍了图像质量评估和点云质量评估的基本概念和常用方法,并提供了相应的源代码示例。图像质量评估关注图像的视觉质量,常用的评估指标包括均方误差(MSE)、结构相似性指标(SSIM)和峰值信噪比(PSNR)。点云质量评估关注点云数据的准确性和完整性,常用的评估方法包括点云配准质量评估、稠密重建质量评估和离群点检测质量评估。在计算机视觉和计算机图形学领域中,图像质量评估和点云质量评估是两个重要的任务。图像质量评估旨在量化图像的视觉质量,而点云质量评估则关注于点云数据的准确性和完整性。 阅读详情

相关推荐

[华为]华为无线控制器AC6508简单配置实例

用户需求:3个地址段,分别是领导、员工、访客,访问控制策略是只允许访客上网,不允许访客访问内网。 vlan173为设备的管理地址和AP获取的地址,领导、员工、访客的vlan分别是vlan131/vlan132/vlan133 首先是许可的下载,使用华为的账号登陆http://app.huawei.com/isdp ,然后按照说明输入许可,下载许可,将许可导入到设备。 web界面访问后,直接按照配置向导配置就可以了。 1.基本配置里主要配置license、设备名称、设备时间 2.端口配置:连接上

日子_很简单 2万+

static analysis tool

最近研究源代码静态分析工具: 静态代码分析工具汇总 http://blog.youkuaiyun.com/jinhill/article/details/6673734 安全测试工具收集 http://blog.youkuaiyun.com/testing_is_believing/article/details/6064201 flawfinder主页:http:/

lsr_fighting的博客 2355

EGO_Planner代码学习(三):px4ctrl代码流程

上节阅读了EGO_Planner的轨迹服务器部分的代码,其实质是将规划器生成的轨迹进行离散化,间隔10ms计算当前时刻在轨迹上的位置,并发送到话题上。这两天抽空看了下控制器部分的代码,在l这个软件包里,它的功能是进行px4的模式识别和上层控制,通过线性控制器把发布过来的位置命令解算成飞控的控制量,通过mavros发送给px4。下面就详细看一下它的启动过程。

qq_41069236的博客 6805

GNU Static Stack Usage Analysis(GCC静态堆栈分析)

The GNU compiler suite comes with the very useful option `-fstack-usage` which produces text files for each compilation unit (source file) listing the stack usage.

zoomdy's blog 6129

别再乱删文件了!修复Print Spooler服务自动停止的3个关键检查点(附Win10/Win11实测)

本文深入解析Windows系统中Print Spooler服务自动停止的常见原因及修复方法。从第三方驱动冲突、权限与服务依赖关系到打印队列积压,提供3个关键检查点的详细排查步骤,帮助用户彻底解决打印服务异常问题,适用于Win10/Win11系统。

weixin_31569671的博客 672

37、基于视觉的轻量级面部呼吸和心率测量技术

本文提出了一种基于视觉的轻量级面部呼吸和心率测量技术,通过远程光电容积脉搏波描记法(RPPG)和面部振动信息实现非接触式生理信号采集。创新性地结合框选和特征点选择多个感兴趣区域(ROI),并采用光流跟踪、主成分分析(PCA)和集成经验模态分解(EEMD)等方法优化信号处理流程。实验结果表明,该方法在测量精度和稳定性方面优于传统方法,并可在树莓派4等低功耗平台上实现实时运行,具有广泛的应用前景。

r7s8t的博客 306

C/C++ static analysis: CodeViz

CodeViz是《Understanding The Linux Virtual Memory Manager》的作者 Mel Gorman 写的一款分析C/C++源代码中函数调用关系的open source工具(类似的open source软件有egypt、ncc)。其基本原理是给 GCC 打个补丁,让它在编译时每个源文件时 dump 出其中函数的 call graph,然后用 Pe

水木日月珠 812

关于瑞芯微SDK中buildroot的架构分析、配置细节、以及一些使用步骤

摘要:瑞芯微SDK基于Buildroot框架,针对RK3568等芯片提供定制化开发环境。核心目录包括buildroot(配置与编译框架)、kernel(定制内核)和u-boot(引导程序)。开发流程为:1)加载芯片默认配置;2)通过menuconfig定制系统(架构、内核、软件包等);3)可选修改内核配置。关键硬件适配需修改设备树(dts)和分区表(parameter.txt),系统行为通过启动脚本(S90network)调整。最终执行make编译生成可烧录固件。该框架通过配置文件驱动,实现从工具链构建到固

Hyjks的博客 1199

LWN: 改进GCC的 -fanalyzer 选项!

关注了就能看到更多这么棒的文章哦~Improvements to GCC's -fanalyzer optionBy Jonathan CorbetSeptember 23, 2021LP...

Linux News搬运工 649

大疆前端开发面试题及参考答案(4万字长文)

在前端项目中,难点和性能优化的挑战无处不在。比如在处理复杂交互界面时,实现流畅的动画效果和实时反馈就是一大难点。当界面中有大量元素需要同时进行交互和动态更新,像电商平台的商品筛选和排序功能,不仅要保证操作的即时响应,还要确保界面在各种设备和网络环境下的稳定性,这就需要对事件处理、DOM 操作和数据更新机制有深入理解。在性能优化方面,首屏加载速度是常见的难点。当页面包含大量图片、脚本和样式文件时,如何合理地进行资源压缩、合并与缓存,以减少加载时间,是需要精心考虑的。

大模型大数据攻城狮的专栏 1154

zemax像差参数Ray Fan/Spot Diagram/MTF/....讲解三

zemax像差参数Ray Fan/Spot Diagram/MTF/....讲解三

weixin_72050316的博客 1384

LWN: kernel中GCC plugin的未来命运!

关注了就能看到更多这么棒的文章哦~The future of GCC plugins in the kernelApril 1, 2021This article was contribu...

Linux News搬运工 1002

cefsharp139-H264-X86升级测试(MP4)-支持PDF预览-chromium7258定制浏览器

CEFSharp 139.x版本升级测试已完成,该版本支持64位系统(需选择x86架构)及WinForms.NETCore(.NET8)。升级内容包括H264文件编译支持Mp4播放,并覆盖WPF、WinForms等平台。文中提供了版本替换方法及不同系统的版本建议(如Win10/11推荐111/133/134/139版)。此外,文章还列举了CEFSharp的多种应用场景,包括浏览器开发、B/S系统封装、资源抓取等,同时指出当前版本均需自行编译以支持MP4播放。详细图文说明及旧版链接已附在正文中。

无线智能模块 可视DIY智能专家 1295

LWN:GCC诊断信息近期改进!

关注了就能看到更多这么棒的文章哦~Recent improvements in GCC diagnosticsBy Jonathan CorbetOctober 13, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946733/编译器的主要任务是将源代码转换成计算机可运行的二进制形式。然而,开发人员对于他们的工具,包括编译器,会有...

Linux News搬运工 715

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

LWN:GCC也支持BPF了!

关注了就能看到更多这么棒的文章哦~BPF in GCCBy Jake EdgeSeptember 15, 2020LPC原文来自:https://lwn.net/Articles/831...

Linux News搬运工 1198

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LWN:GCC BPF 支持的进展!

然而,朝着这个目标前进的过程中,发现了一些 Clang 支持 BPF 的问题,需要进行长时间的讨论,以便为这两个项目找到前进的道路。目前,Ihor Solodrai 维护着 bpf-next 树的持续集成测试(他稍后在会议期间对此进行了介绍),该测试会测试每个提交的补丁,以确保验证器接受的内容没有退化。Song 说,这种 Clang 行为既是故意的,也是 BPF 特定的;他们说,如果外部结构是 CO-RE 可重定位的,那么从逻辑上讲,内部结构也应该是 CO-RE 可重定位的,无论它是如何进入该结构的。

Linux News搬运工 1600

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LWN:深入讨论GCC Rust前端!

关注了就能看到更多这么棒的文章哦~A deeper look into the GCC Rust front-endBy Jonathan CorbetOctober 10, 2022CauldronDeepL assisted translationhttps://lwn.net/Articles/909887/Philip Herron 和 Arthur Cohen 在 2022 年的 Kan...

Linux News搬运工 971

LWN:Rust 与 GCC 的两个开发方案!

关注了就能看到更多这么棒的文章哦~Rust and GCC, two different waysBy Jonathan CorbetOctober 4, 2021LPCDeepL ass...

Linux News搬运工 1437

LWN:对2024所做预测的回顾!

关注了就能看到更多这么棒的文章哦~A 2024 retrospectiveBy Jonathan CorbetDecember 25, 2024Gemini-1.5-flash translationhttps://lwn.net/Articles/1002368/通常人们说的疯狂(insanity),就是重复同样的行为却期待不同的结果。尽管如此,LWN 每年年初都会进行一组预测,然后在年末不得不...

Linux News搬运工 955

LWN:有助于内核加固的GCC功能!

关注了就能看到更多这么棒的文章哦~GCC features to help harden the kernelBy Jonathan CorbetOctober 5, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946041/加固Linux内核是一项无休止的任务,需要在多个方面努力推动。有时,并不需要在内核本身里进行修改,而是通过...

Linux News搬运工 782

LWN:使用GCC编译生成BPF程序

点击上方蓝色“Linux News搬运工”关注我们~ Compiling to BPF with GCC ByJonathan Corbet LPC 自从在kern...

Linux News搬运工 1557

LWN:GCC 中两个安全相关的改进!

关注了就能看到更多这么棒的文章哦~Two security improvements for GCCBy Jonathan CorbetSeptember 24, 2021LPCDeepL...

Linux News搬运工 469

LWN:gccrs开发进展!

关注了就能看到更多这么棒的文章哦~An update on gccrs developmentBy Jonathan CorbetOctober 1, 2024CauldronGemini-1.5-flash translationhttps://lwn.net/Articles/991199/Rust 语言经常被人们诟病的问题是只有一款编译器,这使得很难确定该语言的标准版本,也限制了 Rust ...

Linux News搬运工 1363

LWN:针对有验证功能的目标平台进行编译!

关注了就能看到更多这么棒的文章哦~The challenge of compiling for verified architecturesBy Jonathan CorbetOctober 6, 2023CauldronChatGPT translationhttps://lwn.net/Articles/946254/在表面上来看,BPF虚拟机与许多其他计算机体系结构很相似;它具有寄存器,也有...

Linux News搬运工 648

LWN:在GCC和glibc里支持 CHERI 的 capability!

关注了就能看到更多这么棒的文章哦~Supporting CHERI capabilities in GCC and glibcBy Jonathan CorbetSeptember 26, 2022CauldronDeepL assisted translationhttps://lwn.net/Articles/909265/CHERI 架构来自于一个研究计划,希望能对普通的 CPU 架构进行扩...

Linux News搬运工 526

LWN:GCC 开始支持内核控制流完整性

一个复杂之处在于对类型别名 (Type aliases) 的处理:在 C 代码中,为了提高可读性,经常会使用类型别名,如果为指向同一底层类型的两个类型别名生成不同的哈希值,将会破坏现有的内核代码。一位读者好奇在静态作用域中采用索引加开关 (index+switch) 的方案是否会产生过高的性能影响,这种方案可以避免抑制优化,并可能在内核中实现去虚拟化 (devirtualization),尽管在处理独立编译的文件和加载模块时可能需要一些“链接器魔法”。因此,需要一些特定于架构的代码来实现这些检查。

Linux News搬运工 97
上一篇: LWN: KVM Forum 2019的主要内容!
下一篇: LWN: 把virtio变成真实设备!
LinuxNews搬运工
博客等级 码龄7年 438粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值