静态代码扫描(六)——火线针对资源关闭问题的横向对比报告

本文主要是介绍静态代码扫描(六)——火线针对资源关闭问题的横向对比报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在上一篇文章中,我们列举了一些资源关闭需要考虑的特殊场景,并且预告了会在这篇放出火线和其他开源产品横向的扫描结果对比报告,包括Sonar、Infer、PMD和Findbugs(由于Lint没有针对资源关闭的规则,未加入对比)。

一. 对比结果

我们将资源关闭场景进行了细化和拆分,以保证代码扫描过程中既能检测出已有的问题,同时也不会对正确的写法产生误报。目前共计30个场景。
废话不多说,先上结果:

这里写图片描述

二. 结果分析
  1. PMD
    对比报告中使用的PMD版本为目前最新版本PMD5.6.1。
    PMD是业界老牌的开源静态代码扫描产品,于2002年发布了第一个版本,至今已有15年的积淀。它的优点是支持多种语言的静态扫描,同时由于其将源代码转化为抽象语法树进行分析的引擎特点,扫描速度快。但是也是由于引擎的特点,限制了它应对更加深入的检查需求,目前还难以满足。
    所以大家可以看到上面的结果中,PMD针对很多问题都无法成功检出。

  2. Findbugs
    对比报告中使用的Findbugs版本为目前最新版本Findbugs3.0.1。
    Findbugs也是业界老牌的开源静态代码扫描产品,同时也应该是知名度较高的一款产品。我从官网上只能追踪到最早2004年的BUG反馈,说明Findbugs的积淀和PMD不相上下。Findbugs只支持Java代码扫描,但是它的引擎技术是解析源码编译后的class文件,专业术语为控制流图和数据流分析技术。所以它能做的事情相比较PMD而言深度上更胜一筹。
    在结果对比中可以看到,Findbugs针对资源关闭先后推出了两代规则,分别使用了不同的静态扫描技术(详情可点击)。这表明Findbugs的开发者也发现资源关闭问题并不是一个简单的问题,它的场景复杂性以及实现的难度都超乎想象。(为什么复杂?请回顾静态代码扫描系列文章第四篇;有哪些复杂场景?请回顾静态代码扫描系列文章第五篇。)
    从以上的结果对比也能看出,即使Findbugs出了两代规则,也没有很好的解决资源关闭的问题。同时由于Findbugs开发者的退休老去,项目已经两年多没有更新版本,未来令人担忧。

  3. Sonar
    对比报告中使用的Sonar版本为目前最新版本Sonar6.3.1。
    Sonar是产品化很用心很完善的开源静态代码扫描产品。从它的目前官网风格来看,猜不到它也是有着10年历史的产品。它目前的引擎跟PMD相似,所以扫描结果也很相似。在两年前曾在它的官网看到关于底层引擎的升级预告,即将引入控制流图和数据流分析的引擎,但是两年过去了,官网的设计和实现有了很大的改进,希望很快也能看到底层引擎的改进。
  4. Infer
    对比报告中使用的Infer版本为目前最新版本。
    Infer作为Facebook旗下的开源产品,在即使不支持window的情况下,github都已经收获了6000+的Star,可见它的影响力和实力。Infer侧重于移动APP方向的检查,包括java、Objective-C 和 C语言。它作为一个后起之秀,底层引擎也很特殊,它是先把待检测语言转为OCaml,再去解析转化之后的OCaml语言。这是由于Infer有独到的针对OCaml语言的字节码解析器,但是这种方式在某种程度上牺牲了扫描效率,也算是有得有失。
    从对比结果可以看出,Infer发现问题的能力是很不错的,但是误报较多,说明对于很多特殊的场景并没有做处理。
  5. 火线
    对比报告中使用的火线版本为目前最新版本Fireline1.2.4。
    火线目前还未开源,但是提供无限制的免费使用。火线作为各个开源产品的后辈,诚惶诚恐。火线从360公司内部的需求孵化而出,主要针对Andriod代码的安全问题扫描。在帮助公司内部解决了很多有价值的问题后,逐渐的走向公司外部,希望能帮助更多的人解决更多的问题,同时也希望通过大家的反馈帮助我们的火线更快的成长和进步。
    这次基于资源关闭的研究,是我们火线团队遇到了很多关于资源关闭的问题,它是很多开发的痛点,并且目前市面上并没有发现很好的解决方案。所以火线投入了大量的精力进行深入的研究。我们认定,如果能够帮助大家解决这个痛点,将会给大家带来很大帮助,同时我们的火线产品也将获得更多的认可。
三. 火线未来

我们在不断改进火线的过程中,已经收到了很多同学的反馈和建议。从大家的反馈中,我们发现了大家不同的需求,有希望火线支持IOS扫描的、有希望支持最近大火的语言Kotlin扫描的、也有希望针对圈复杂度和覆盖率进行统计的需求等等。作为火线的开发,我非常想满足所有人的所有需求。可是目前火线受制于某些原因,还没有足够多的人力以快速支持所有人的期望。我的想法是这样的,先集中力量解决大部分人共同的痛点;同时,希望大家能够多多反馈,反馈邮箱g-qtest-fankui@360.cn(PS:我们领导也能看到反馈),用来帮助我们火线争取更多的资源来更快的发展。

不论是PMD、Findbugs、Sonar还是Infer,不管是开源还是商业产品,在静态代码扫描的领域,中国一直在国外的身后追赶。我们希望有一天,中国能有一款产品让国外的产品刮目相看,我们希望,这款产品是——火线。

这篇关于静态代码扫描(六)——火线针对资源关闭问题的横向对比报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/620830

相关文章

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

购买磨轮平衡机时应该注意什么问题和技巧

在购买磨轮平衡机时,您应该注意以下几个关键点: 平衡精度 平衡精度是衡量平衡机性能的核心指标,直接影响到不平衡量的检测与校准的准确性,从而决定磨轮的振动和噪声水平。高精度的平衡机能显著减少振动和噪声,提高磨削加工的精度。 转速范围 宽广的转速范围意味着平衡机能够处理更多种类的磨轮,适应不同的工作条件和规格要求。 振动监测能力 振动监测能力是评估平衡机性能的重要因素。通过传感器实时监

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

缓存雪崩问题

缓存雪崩是缓存中大量key失效后当高并发到来时导致大量请求到数据库,瞬间耗尽数据库资源,导致数据库无法使用。 解决方案: 1、使用锁进行控制 2、对同一类型信息的key设置不同的过期时间 3、缓存预热 1. 什么是缓存雪崩 缓存雪崩是指在短时间内,大量缓存数据同时失效,导致所有请求直接涌向数据库,瞬间增加数据库的负载压力,可能导致数据库性能下降甚至崩溃。这种情况往往发生在缓存中大量 k

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d