【关注我,后续持续新增专题博文,谢谢!!!】
上一篇我们讲了:
这一篇我们开始讲: Coverity本地增量C/C++代码检查(Linux)操作简介
目录
2.3.1 :执行cov-run-desktop --setup
一、Coverity工具简介
Coverity 是一款精确的综合静态分析与应用安全测试 (SAST) 平台,它可以在编写代码时发现关键的缺陷和安全缺陷,防止它们变成安全漏洞、故障或维护缺陷。
Coverity产品概述
Coverity 利用精确和有效的修复指南,基于专利技术以及对 100 亿行专用和开源代码的十年研发和分析经验,可以识别出开发期间的关键质量缺陷和潜在安全漏洞,有助于降低风险和整体项目成本。
Coverity支持语言
Coverity提供全面广泛的安全漏洞和质量缺陷检查规则,如Java、C/C++等,涵盖22种编程语言。
二、:Linux本地coverity扫描
2.1:适用范围&说明
已经有coverity问题,本地修改代码后,需要在本地linux编译环境进行代码分析的工程师,下述每个步骤都需要执行确认!!
整个过程如下:
工具安装与环境配置 --> 编译代码 --> 分析文件 --> 生成html报告
2.2 :工具安装与环境配置
2.2.1 :工具安装
首先,确认本地的coverity版本。目前版本与coverity版本对应关系如下:
Coverity工具各个版本在个人调试云上都有,目录:/work/coverity/,因此本地使用哪个版本,配置一下对应的工具path即可,如:
#analysis_2023_3.2版本
export PATH=/work/coverity/analysis_2023_3.2/bin/:$PATH#analysis_2024_3.0版本
export PATH=/work/coverity/analysis_2024_3.0/bin/:$PATH其次,本地确认coverity版本,与coloros版本匹配可以跳过3.2.1章
执行命令:cov-build验证安装结果
cov-build
如果出现的版本信息与安装版本一致,则代表安装成功,如果版本不一致,执行以下命令:
source /etc/profile
**若出现无权限的报错提示,并不影响执行效果**
cov-build
如果已安装cov-build,也可以手动设置变量PATH
export PATH=/work/coverity/analysis_2023_3.2/bin/:$PATH版本:2023.3.2
路径:/work/coverity/analysis_2023_3.2
2.2.2 :环境配置
配置认证文件
请拷贝账号authkeys目录到个人用户目录下 ~/.coverity/
mkdir ~/.coverity
cp -rf /work/coverity/authkeys/ ~/.coverity/
chmod 600 ~/.coverity/authkeys/ak*
10.21.211.12 和172.18.148.20 服务器的key文件如下,拷贝到路径~/.coverity/authkeys/下,拷贝后需执行chmod 600命令。
其他服务器key文件在/work/coverity/authkeys/下是正确的,无需其他操作
配置coverity.conf
1、请将coverity.conf文件拷贝到代码根目录下
cp -rf /work/coverity/coverity.conf <代码目录>/source/2、进入到代码根目录下,修改coverity.conf文件内容:host、stream、compiler_config_file
整个扫描过程会将本地扫描结果与coverity服务端数据进行比对,如果是服务端已存在并忽略的问题,本地html报告也不会呈现。所以需要配置要比对的coverity服务器host与数据流stream。
若涉及java文件扫描,需修改javac
(如果不扫描java文件可跳过此步)
由于Coverity工具缺陷,不能直接检查jdk11或jdk17编译的代码,无法正常捕获到文件,故需要进行特殊处理:
注意:Android-T的项目需要操作jdk11,Android-U的需要操作jdk17,Android-V的jdk21
修改完jdk后,需要重命令jdk11-real/jdk17-real/jdk21-real中Android.bp为Android_bak.bp类似报错如下:
重命名Android.bp否则编译报错(prebuilts/jdk/jdk17/Android.bp, 第15行:module "prebuilt_javap" already defined)###备份原始的jdk 注意:要操作对应jdk版本
cp -r <代码路径>/prebuilts/jdk/jdk11/ <代码路径>/prebuilts/jdk/jdk11-real
###删除老的javac
rm <代码路径>/prebuilts/jdk/jdk11/linux-x86/bin/javac
###重新生成javac
vim <代码路径>/prebuilts/jdk/jdk11/linux-x86/bin/javac###将以下3行内容写入javac并保存
#!/bin/sh
javacpath="`echo $0 | sed 's|/jdk11/|/jdk11-real/|'`"
"$javacpath" "$@"###给javac增加执行权限
chmod +x <代码路径>/prebuilts/jdk/jdk11/linux-x86/bin/javaccd <代码路径>/prebuilts/jdk/jdk11-real
mv Android.bp Android_bak.bp
2.3 :编译&检查
2.3.1 :执行cov-run-desktop --setup
批量执行以下内容:
export ALLOW_NINJA_ENV=true
export COVERITY_NO_PRELOAD_CLASSES="java.io.ObjectInputStream;java.lang.UNIXProcess"
cov-run-desktop --setup
2.3.2 :执行cov-build 编译检查
【编译过程建议】
第一步:完整编译
此时不要带cov-build,可以全编译组件 或者 模块编译
第二步:修改文件
此时可以修改代码解决问题
第三步:cov-build编译首次扫描需要进行一次coverity的全编译,会比较慢,另外,Coverity的编译会受原生编译的影响,大概率是本地原生编译已经过了,未做任何修改,再进行coverity编译时,由于是增量编译,没有任何文件修改,没有文件被再次编译。解决方案:
1、删除原生编译的相关out目录 如sys/out vnd/out
2、删除掉idir
3、重新执行cov-build --dir idir 编译命令
2.3.3 :确认可分析的文件列表
先罗列patch修改的文件列表 (一般是.c/.cpp/.java 这类文件)
执行下述命令查看具体哪些文件能够分析,只有在该列表中且无错误的文件才能进行分析。注:多个文件之间用竖线间隔,竖线前后没有空格
cov-manage-emit --dir idir list | grep -E '目录1/文件1|目录2/文件2|文件3'
2.4 :文件分析
获取到上步可分析的文件列表后,执行下述命令:
cov-run-desktop --dir idir --reference-snapshot latest --set-new-defect-owner false --whole-program [filename1] [filename2] [分析多个文件,空格隔开]
备注:可以分析多个文件,以空格隔开文件(前提是该文件被编译捕获到了)
另外,有一个无需指定具体文件,直接分析全部编译捕获到的文件:
cov-run-desktop --dir idir --reference-snapshot latest --set-new-defect-owner false --whole-program --analyze-captured-source
但是,如果cov-build捕捉到的文件特别多,超过千个,不能使用此方式!会报错!只能指定文件方式扫描!
2.5 :输出成html报告
因本地检查工具不能把结果推送到服务器上进行查看, 如果不习惯窗口的文件检查结果显示,可以运行以下命令生成html文件查看:
cov-format-errors --dir idir --html-output outdir
结果会生成到outdir目录下,查看index.html文件
【关注我,后续持续新增专题博文,谢谢!!!】
下一篇讲解: