Coverity构建捕获怎么配置,还有构建捕获不到编译命令的时候又该怎么办,做静态代码扫描时常会在这两步被卡住。Coverity分析C/C++、Java、C#这类编译型项目时,一般需要先把真实的构建过程捕获下来,这样工具才能知道源文件是怎么被编译的,用了哪些宏定义、头文件路径在哪里,以及编译时带了哪些参数。配置的时候,不能只把源码目录丢给工具,还得让它看到一次完整、干净、可复现的构建过程。
一、Coverity构建捕获是怎么配置的
在配置Coverity构建捕获之前,操作者要先确认项目在这台机器上能不能正常编译通过。编译器、构建工具、依赖库、环境变量、许可证和脚本权限都要提前准备好。官方的配置说明里也提到,编译型语言做构建捕获时,需要把构建命令和清理命令都提供出来,并且构建环境组件在捕获发生的位置也要可用。
1、要先去准备一套干净的构建环境
构建捕获最好从一次干干净净的构建开始,不要直接把已经编译过的目录拿去做扫描。如果没有实际的编译动作发生,Coverity就捕获不到编译命令。操作者可以先跑一下项目原本的clean命令,把中间文件清掉,清完后再把完整的构建跑起来。
2、去拿cov-build把构建命令包在里头
操作者要靠cov-build这个东西,把中间的目录指定出来,再把真实的构建命令搁在它后头。
比较常见的写法跟cov-build--dir cov-int make clean all差不多,CMake、Ninja、MSBuild、Maven、Gradle或者厂商IDE的命令行构建,也要照这一套思路来做。这里要紧的不是命令被写成了什么样子,而是Coverity必须把真正发生编译的那一步包在里头。
3、去把编译器识别的规则配好
如果项目用的是GCC、Clang、MSVC这种常见编译器,一般比较容易认出来;可要是碰上交叉编译器、嵌入式编译器或者厂商自己定制的编译工具,就有可能需要靠cov-configure去把编译器配置补上。不然的话,构建过程虽然跑完了,Coverity却不清楚这些命令属于可分析的编译动作。
二、Coverity构建捕获不到编译命令了要怎么办
构建捕获抓不到编译命令的时候,比较常见的表现是中间目录里没有可用的有效编译数据,或者跑出No files were emitted这类提示。这通常不是扫描服务器出了毛病,而是在捕获阶段根本没有看到真实编译,编译器没被认出来,或者构建命令被脚本绕开了。
1、去查一查编译是不是真的发生了
如果构建系统自己判断目标文件已经是最新状态,就不会重新编译源文件。Coverity包住的那条命令看着像是顺利跑过去了,可实际上只做了检查、链接,或者直接跳过了编译,这样自然什么也捕获不到。碰上这种情况,要先把构建目录清一下,再重新把完整构建跑一遍。
2、去把构建捕获的日志翻出来看一看
操作者进入cov-int目录以后,要把build log、warning,还有跟编译器相关的那些信息全扒拉出来瞧瞧。
在日志里面,一般能看出哪些命令被认下了,哪些命令被跳过去了,是不是有什么没被认出来的编译器、路径找不着了,或者权限不够这类问题。操作者不要光盯着控制台最后那行“构建成功”去看,因为项目构建成功,不代表Coverity已经正确地把东西捕获到手了。
3、要去确认构建命令没有从cov-build手边绕过去
有些CI脚本会在子进程里、容器里、被扔到远端构建节点上,或者被包在第二层脚本里,才把真正的编译跑起来。如果cov-build只包住了最外面那层脚本,实际编译却是在另一套环境里发生的,那就可能捕获不到。需要让Coverity待在真实编译发生的位置上跑,而且要把最终会调用编译器的那条命令包在里头。
三、Coverity构建捕获怎么把问题减下来
Coverity的构建捕获被弄稳当以后,后面的扫描才有了能落脚的地基。不少项目头一回能跑通,可一放进CI里又不行了,原因常常是环境没有对上、增量构建、脚本权限或者编译器路径起了变化。
1、去把构建脚本和环境变量固定下来
在本地、CI和构建服务器上,最好使用同一套构建脚本。编译器的路径、SDK的路径、头文件的路径、宏定义,还有目标平台的那些参数,都不要靠人工临时设置。环境越稳当,捕获出来的结果就越容易被复现出来。
2、去把交叉编译器单拎出来对付
嵌入式项目经常用到arm-none-eabi、IAR、Keil、Green Hills这类编译工具。碰到这类项目时,要把心思压在编译器有没有被Coverity认出来这件事上。要是日志里显示是一个没被认出来的编译器,就要把对应的配置补上去,而不是翻来覆去地改源码路径。
3、去把捕获结果和分析结果掰开来查
构建捕获跑失败的时候,操作者先别急着去看缺陷报告。应该先去确认cov-int目录里有没有装着管用的东西,编译命令是不是已经被抓在手里,源文件被数出来的数目是不是在合情合理的范围里。捕获阶段要是不齐全,后面的分析结果就算生成了,也可能把大量代码漏掉。
总结
Coverity的构建捕获是怎么配置的,还有构建捕获抓不到编译命令了又要怎么办,关键就是让Coverity看到一回真实、完整、干净的构建过程。配置的时候,要拿cov-build把实际的编译命令包在里头,还要照着项目情况把编译器配置补上。抓不到编译命令时,要把心思压在是不是做了clean build、编译器有没有被认出来、构建命令有没有被脚本或CI环境绕开,以及cov-int日志里是不是有有效的编译数据这几件事上。先把捕获的整条链路跑顺了,再回过头去看分析结果,这样排查起来心里会清楚很多。
