文章目录
SonarQube审查C/C++代码
一、背景
SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误。SonarQube有很多版本(社区版、开发人员版、企业版等),只有社区版是免费使用,但该版本不支持C/C++语言的静态代码分析。下面通过配备一些免费的插件集成到SonarQube以达到审查C/C++代码的目的。
二、工具准备(附本例版本)
- SonarQube (8.9.8 LTS : Community Edition) : 展示扫描报告
下载网址:https://www.sonarqube.org/downloads/ - JDK (11.0.15) 版本过低SonarQube启动会报错,必须是11+的JDK
下载网址:https://www.oracle.com/java/technologies/javase-jdk11-downloads.html - Sonar-cxx plugin (V2.0.7)
下载网址:https://github.com/SonarOpenCommunity/sonar-cxx/releases- 支持C/C++多种编码标准
- 支持windows/Linux
- 提供了多种传感器: 如cppcheck/gcc/valgrind等
- 提供了对单元测试/覆盖率数据的分析功能
- 支持自定义扩展规则
- Sonar-scanner (4.7) : 扫描仪
下载网址:https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/ - Cppcheck (2.7) : c/c++代码的静态分析工具
下载网址:https://cppcheck.sourceforge.io/
注:S00和Sonar-cxx版本要对应。可参考下表选择需要的版本。
三、部署环境
1、JDK
(1)下载JDK时保存好安装路径
(2)配置系统环境变量
新建系统变量:JAVA_HOME
变量值:C:\Program Files\Java\jdk1.8.0_331(jdk安装路径)
新建系统变量:CLASSPATH
变量值:.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
编辑Path环境变量
添加:%JAVA_HOME%\bin
%JAVA_HOME%\jre\bin
(3)验证测试
在cmd窗口中运行java、javac、java -version语令不报错即配置成功。
2、SonarQube
(1)下载好sonarqube后,解压打开bin目录,启动对应OS目录下的StartSonar。如本例使用的是win的64位系统,则打开…\bin\windows-x86-64\StartSonar.bat
(2)启动浏览器访问http://localhost:9000,如出现下图则安装成功
第一次登陆,默认Login、Password为:admin
(3)登陆Sonarqube后如需下载中文包,请按以下步骤安装插件(需联网)
Administration->Marketplace
3、Sonar-cxx
将下载好的.jar文件,放到你的sonarqube目录/extensions/plugins目录下,重启SonarQube生效(此处报错重启PC能解决大部分问题)。Language中出现cxx则配置成功。
4、Sonar-scanner
(1)下载好后解压打开bin目录、配置环境变量
编辑Path环境变量,将Sonar-scanner的bin目录添加进去
(2)cmd中验证是否配置成功
5、Cppcheck
(1)安装路径添加到Path环境变量
(2)cmd中验证是否配置成功
四、实战
1、Sonarqube自定义cxx规则
在sonarqube平台质量配置页面,新增cxx的质量配置项并激活更多规则
——>
——>
——>
——>
激活完成后,将该规则项设置为默认
2、使用Cppcheck对项目代码进行分析
在项目文件夹的根目录下使用cppcheck工具扫描代码,结果记录到cppcheck-report.xml中
语令:cppcheck --xml --xml-version=2 --enable=all ./ 2>cppcheck-result.xml
注:扫描时间会有些长,等待完成后再进行下一步操作
项目根目录下生成的cppcheck-report.xml文件
3、配置项目的一些必要信息
(1)在项目的根目录创建sonar-project.properties文件
(2)文件内容:
#sonarqube中相对应项目的key(可省)
#sonar.projectKey=TestMemory
#sonarqube中相对应项目的名字(可省)
#sonar.projectName= TestMemory
#sonar检测的编程语言种类
sonar.language=c++
#sonar检测的源文件目录,‘.’表示当前根目录下的所有文件目录
sonar.sources=.
#项目各文件的后缀名(可在sonarqube中定义)
sonar.cxx.file.suffixes=.cxx,.cpp,.c,.cc,.hxx,.hh,.h,.handles
#cppcheck生成的Report名称(可在sonarqube中定义)
sonar.cxx.cppcheck.reportPaths=cppcheck-result.xml
(3)在sonarqube中定义项目各文件的后缀名:
(4)在sonarqube中定义cppcheck生成的Report名称:
注:sonarqube中的设定比sonar-project.properties文件里的设定优先级要高
4、Sonarqube创建项目
——>
——>
——>
5、使用sonar-scanner进行代码的静态扫描
复制sonar-scanner语令:
项目根目录下打开cmd执行上面Copy的语令:
在Sonarqube上查看结果: