本方案将以编程语言种类为列表,分别介绍各种编程语言的Coverity扫描方案,本方案包含全量扫描方案以及增量扫描方案。关于Coveriy的使用规范和方法请参考:Coverity使用规范 Coverity 平台使用方法 Coverity 报告查看
C/C++ golang java等编译类语言
全量扫描方案
全量扫描方案就是对于整个项目的代码作为一次编译单元,Coverity参与整个项目代码的编译过程,从而对整个编译过程进行分析,得到所有的扫描问题。全量扫描因为是扫描全量的代码,扫描速度对于大一些的项目,速度会比较慢,通常建议在本地或者daily build阶段做全量扫描。
Linux本地环境静态coverity生产流程
Windows本地环境静态coverity生产流程。
增量扫描方案
增量扫描是针对于单次改动的代码,根据改动后的代码,Coverity扫描得到与增量代码相关的一系列问题。增量扫描相对于全量扫描的应用场景建议是在pre-build阶段,通过增量扫描的方式得到跟单次改动相关的问题,从而触发需相关问题的处理决策。
方案一:基于改动文件列表
Coverity 本地增量扫描方案(基于改动文件列表)(c/c++)
方案二:基于远端stream
Coverity 本地增量扫描方案(基于远端stream)(c/c++)
方案三:两次全量扫描比较
Coverity本地增量扫描方案(基于两次全量扫描比较)(c/c++)
关于缓存(以ccache为例)
对于增量扫描方案,扫描速度是一个重要的指标,引入缓存机制对提升扫描速度会非常有利。下面介绍下三种方案对于缓存机制的利用介绍:
方案一: 获取到新增文件列表后,如果本地已有缓存,可以直接进行cov-build,cov-analyze等,因为缓存机制,只会对改动文件相关的代码进行编译,扫描出来的结果也只会是参与编译的文件相关的问题。如果本地没有缓存,可以在扫描前先执行一次正常的编译生成缓存,再进行扫描。由于cov-build的时间会比正常build时间要长,先执行一次build后再扫描也会大大缩短扫描时间,当然,如果有共享缓存,也是可以直接利用,最好用只读模式。
方案二:由于需要一次全量扫描并上传到coverity后台,利用缓存机制会造成非全量代码参与编译扫描,从而影响coverity后台数据的准确性,所以在做第一次全量扫描上传时候不太适合缓存机制。但在执行cov-run-desktop增量分析的时候,是可以用到缓存的。也就是说,在这种方案里,建议全量扫描之前清理一次缓存,全量扫描过程就会生成全新的缓存,再执行增量扫描时候便会利用到缓存。
方案三:实际是对两次全量编译的问题进行比较,如果有缓存机制,特别是有共享缓存路径,可以两次扫描都利用共享缓存来缩短扫描时间。共享缓存需要设置以下环境变量;
export CCACHE_DIR=<ccache缓存路径>
export CACHE_UMASK=002
unset CCACHE_HARDLINK
多人同时写ccache缓存可能引起IO带宽不够反而降低效率,共享用户最好增加下面配置, 仅只读缓存内容:
export CCACHE_READONLY=1
Python JS TS等非编译类语言
全量扫描方案
Linux本地环境静态coverity生产流程 (解析型语言python等)
增量扫描方案
方案一:基于远端stream
Coverity 本地增量扫描方案(基于远端stream)(python)
方案二:基于两次全量扫描比较
Coverity本地增量扫描方案(基于两次全量扫描比较)(python)