源代码缺陷检测工具选型(1)

在源代码静态分析和缺陷检测方面,目前市场上主要有Coverity、Checkmarx、Klockwork和CoBOT。前三个为国外工具,最后一个是国内检测工具。其中Coverity和Klockwork都是美国厂商,Checkmarx是以色列厂商。这些工具有什么特点,各自有什么优势呢?笔者的企业正好在筹备引进源代码缺陷检测工具,所以有机会就四款工具进行了对比验证。截止今天只使用两款工具Checkmarx和CoBOT,我先简单总结了一下这两款工具的验证情况。

验证中我们选择了一个C++样例,主要是进行同学录管理程序进行评估。

首先是Checkmarx,这工具是以色列的工具,我评估的版本是6.2.7.8,为了检测出的缺陷尽可能多,我把所有的检测器都选择了,如下。

源代码缺陷检测工具选型(1)_第1张图片

 

使用很方便,选择检测的文件夹,就启动检测了,一共两个文件,是722行C++代码,检测时间大概需要100秒左右,共列出缺陷392个。从里面找了几个缺陷,看了一下,发现基本还正确,虽然说有些不是太理解,需要查百度,或去查CVE或MISRA资料,我英文不是太好,理解起来有点费劲。

概括起来,Checkmarx的工具使用感受为:

 

  1. 代码中的中文注释,显示为乱码,对于有强迫症的人来说,估计有点难受。
  2. 在Results History 中,检测器有缺陷和无缺陷的混杂在一起,需要消耗时间筛选
  3. Show Description显示缺陷描述是浮动窗口,3秒钟左右就消失,需要反复点,影响阅读样例。
  4. 缺陷描述信息比较简单,基本上读不懂,需要借助其它资料帮助理解。
  5. 需要连接网络,才能看到更详细的信息CVE或MISRA上的资料。
  6. 能够导出Excel格式文件,还有另一种格式,不知道怎么读。

缺陷说明中很多链接,例如:

源代码缺陷检测工具选型(1)_第2张图片

源代码缺陷检测工具选型(1)_第3张图片

 

单击里面的链接,例如CVE-2005-3119,基本上无法打开,因为链接到MISER 或CVE网站,这些网站都无法网站,所以无法读懂代码

 

样例代码:

源代码缺陷检测工具选型(1)_第4张图片

使用CoBOT 3.6.2.4版本进行检测,比较方便的是除了支持文件夹导入文件,也支持压缩文件形式,很方便。把里面的针对的c++的所有检测器全部选中,如下图:

源代码缺陷检测工具选型(1)_第5张图片

 

CoBOT检测耗时大概30秒左右,共检测出缺陷1424条,由于使用多个规则集,进行合并后为750条。打电话问了售后,知道是因为不同的标准相互之间有重的规则,有相同缺陷的错误进行了合并。

这是合并前的数字,致命22条、严重31条、一般19条、警告975条、建议377条。不像Checkmarx,所有缺陷混杂在一起,CoBOT对缺陷这种分类,相对Checkmarx里面缺陷不分类要易读性好。

CoBOT缺陷描述使用中文,看起来还是比较容易理解。

源代码缺陷检测工具选型(1)_第6张图片

详细错误描述中,还有错误代码样例,以及缓解和预防措施,很容易读懂。

源代码缺陷检测工具选型(1)_第7张图片

 

下面还有错误修复样例代码,真心比较用。

源代码缺陷检测工具选型(1)_第8张图片

由于检测中的缺陷有几百个,我挑选了一个平时最关心的缺陷进行查看,内存泄露。Checkmarx报出了两个缺陷,两个缺陷的情况类似,列举一个如下:

源代码缺陷检测工具选型(1)_第9张图片

对应两个缺陷:

源代码缺陷检测工具选型(1)_第10张图片

对应的函数代码如下:

源代码缺陷检测工具选型(1)_第11张图片

 

查看CoBOT给出的错误里面,没有找到内存泄漏问题,于是我进行初步分析。AddRecord_f的功能是向链表中插入结点,使用malloc申请内存后,接受输入,输入的数据会保存在申请的内存中,并把该节点插入到链表中,函数最后不能使用free释放该内存指针,否则内容就丢失了,而是在链表不再使用时,逐一释放各个节点。上面问题实际上是Checkmarx误报的缺陷。

这种问题我惊叹为什么CoBOT没有发生误报呢?我翻阅了CoBOT使用手册和白皮书,找到了原因。原来CoBOT是采用值依赖的分析技术,能够跨函数、跨文件分析符号的值,而不是在一个函数中发现有malloc申请内存,没用调用free就报内存泄露错误,是需要全文进行符号跟踪计算,具体原理我也不是太懂了,反正感觉还挺强大的。

关于Checkmarx和CoBOT工具的对比,我简单就写到这里,后面再详细对比。

 

(待续)

 

 

你可能感兴趣的:(代码安全,源代码缺陷检测,代码安全,静态检测,安全漏洞检测)