第一步:下载sonarqube
我所使用的版本是 sonarqube 8.9(社区版),搭配 sonar-scanner 5.0 + cppcheck + sonar-cxx-plugin-2.1.0.428.jar。
官网下载地址:Download Previous SonarQube Versions | Sonar (sonarsource.com)
注意:7.9版本及以上无法搭配jdk8使用
官网提供的下载版本,最低支持到7.9,即官网无法下载适配jdk8的版本,如需使用更低版本,需要在网上自行搜索
下载应用解压后,进入bin文件夹,可以看到:
从windows目录进入,找到StartSonar.bat并点击,一个cmd会弹出,显示如下:
这样代表成功开启sonar服务器
然后,登陆localhost:9000:
打开网页地址:http://localhost:9000(若配置本地服务器,则 localhost 要改为相应值,我配置 postgresql,使用 http:/127.0.0.1:9000 登入)
初始账号密码均为admin,按照系统要求重置密码后,进入界面显示如下:
配置本地数据库(以 postgresql 为例)
1.2.创建sonar用户及sonar数据库
(1)创建用户——sonar
双击Login/Group Roles——>在General中输入Name:sonar——>在Definition中输入密码:123456——>在Privileges中勾选(可参考下图步骤)
(2)创建sonar数据库
双击Databases——>在General中输入Name:sonar
切换用户连接
右击PostgreSQL——Disconnect Server
右击PostgreSQL——Properties…
右击PostgreSQL——Connect Server,输入密码
在 sonarqube 的 conf 文件夹下,找到 sonar.properties文件。在其中,需要添加如下信息:
sonar.jdbc.url=jdbc:postgresql://localhost/sonar?currentSchema=public # sonar表示数据库名字
sonar.host.url=http://localhost:9000/sonarqube
sonar.jdbc.username=sonar #数据库用户名
sonar.jdbc.password=123456 # 密码
sonar.login=admin #登陆sonarqube的名字
sonar.password=admin #登陆sonarqube的密码
如下图所示
第二步:下载scanner
在官网下载:SonarScanner (sonarsource.com)
(无适配要求,下载最新版即可)
打开控制面板,配置系统环境变量,在环境变量PATH里加上:(安装包保存路径)\sonar-scanner\bin
在cmd中输入sonar-scanner -v出现以下显示说明配置成功:
如何使用
- 在项目根目录下新建文件sonar-project.properties,添加如下配置:
#sonarqube服务器地址
sonar.host.url=http://IP:9000 # 使用 postgresql,则修改为 http://127.0.0.1:9000
#sonarqube用户名
sonar.login=sonar
#sonarqube密码
sonar.password=sonar2019
#项目唯一标识(不能出现重复)
sonar.projectKey=testsonar
#项目名称
sonar.projectName=testsonar
#源代码目录
sonar.sources=src/main
#版本号
sonar.projectVersion=0.0.1-SNAPSHOT
#语言
sonar.language=c++
#源代码文件编码
sonar.sourceEncoding=UTF-8
- 然后在项目根目录运行cmd执行sonar-scanner:会在终端输出分析信息,显示运行成功,我们就可以在SonarQube中查看到代码质量报告了
(截取输出末尾部分)
第三步:下载cppcheck
下载网址:cppcheck download | SourceForge.net
配置环境路径PATH,并测试
因为sonar应用商场中,没有免费的c++检测插件,所以我们使用github上的开源文件进行平替
下载地址:Releases · SonarOpenCommunity/sonar-cxx · GitHub
下完后放到sonarqube解压文件夹的/extensions/plugins目录下
登录:localhost:9000 ,点击代码规则,可以看到C++(Community) (如果下载cxx插件版本为2.0以后,则看到 cxx),说明上述操作顺利完成
配置代码规则 -> 质量配置 -> 激活规则
然后,在需要检查的工程文件处打开终端,输入
cppcheck -j 1 --enable=all --xml ./* 1>cppcheck-result.xml 2>&1
编辑 sonar-project.properties
在其中加入
sonar.cxx.cppcheck.reportPath=cppcheck-result.xml
soanr.cxx.includeDirectories=/
添加之前的原配置文件:
sonar.projectKey=项目名
sonar.projectName=项目名
sonar.projectVersion=1.0
sonar.sources=C:\\Users\\lenovo\\Desktop\\项目名
sonar.sourceEncoding=UTF-8
sonar.language=C++
开启故障检测和覆盖率检测的配置文件示例:
sonar.host.url=http://127.0.0.1:9000
#sonarqube用户名
sonar.login=sonar
#sonarqube密码
sonar.password=sonar2019
sonar.projectKey=testsonar
sonar.projectName=testsonar
sonar.sources=./
#这个属性可以解决和SVN的冲突问题,当扫描目录存在.svn文件时,就报出扫描错误,设为true即可避免
sonar.scm.disabled=true
sonar.cxx.cppcheck.reportPaths=reports/cppcheck.xml
sonar.cxx.cobertura.reportPaths=reports/coverage.xml
sonar.projectVersion=0.0.1-SNAPSHOT
sonar.language=c++
sonar.sourceEncoding=UTF-8
#设定被检测的文件后缀,避免误检
sonar.cxx.file.suffixes=.cxx, .cpp, .cc, .c, .hxx, .hh, .handled
#屏蔽sonarqube预留的付费c/cpp插件接口,避免与cxx-plugins冲突
sonar.lang.patterns.c=""
sonar.lang.patterns.cpp="
执行sonar-scanner
生成以下结果说明检测成功:
生成以下结果说明故障和覆盖率检测成功开启:
第四步(选择):sonarqube 导出PDF报告
下载地址:https://gitee.com/zzulj/sonar-pdf-plugin
根据sonarqube版本,在“统计”下选择适配的pdf插件版本
将下载好的sonar-pdfreport-plugin-xxx.jar 插件拷贝到 extensions\plugins 目录下。
然后,重启服务:点击 Restart Server,等待服务重启完成。
重启完成后,进入项目目录,在 more 下即可看到 Download PDF Report。
在Administration->Configuration->General Settings->PDF Report目录下,可以设置下载使用的用户名和密码:
注意:重新启动服务后,重新使用sonar-scanner指令
c++代码检测
配置完成后,发现无法分析c++代码的bug和coverage。先后尝试了6.7和8.9版本,最后锁定8.9社区版,即可实现c++代码完整检测。
搭配postgresql 9.6,在sonar-scanner中设置(在sonar-scanner.properties中添加)
sonar.host.url=http://localhost:9000
sonar.jdbc.url, sonar.jdbc.username, sonar.jdbc.password同sonarqube中设置
设置cxx插件检测文件后缀:
注:另外,2.0版本之后,plugin不再以 c++(community) 命名,而以 cxx 命名,同时,sonar.cxx.cppcheck.reportPath 改为 sonar.cxx.cppcheck.reportPaths,sonar.cxx.coverage.reportPath 不再支持,应当细分为扫描工具-coverage-路径,如 sonar.cxx.cobetura.reportPaths。
生成代码故障检测结果
先从pgadmin(postgresql 应用)连接数据库,然后打开 http://127.0.1:9000,这时,在rule中看到的不再是c++(community),而是cxx,这是c++插件2.0的特性。同样地,从quality profiles中新建cpp-demo,激活规则,无需选择语言,自动导入即可(注意:最后要将quality profiles中的cpp-demo设置为default)。
无需build-wrapper,只需先在工程文件夹下运行指令(注:需在git bash下运行,在powershell下运行该指令会报错,生成结果中会有多余部分):
cppcheck --enable=all --xml --xml-version=2 ./ 2> report/cppcheck.xml
再运行sonar-scanner即可检出(c++bug)
注:如在 windows 系统下需要运行以上指令,需要通过 git bash 指令框进行操作,如果使用 powershell 将会报错。Git bash 安装不再赘述。
生成覆盖率文件xml
Sonar C++ plugin只是完成了报告的读取,并没有任何代码分析的功能。任何的结果,都依赖于工具链中前述工具所生成的报告。
为了在cmake编译过程中生成gcov所需的文件,需要在根目录的makeLists.txt中加上以下语句:
OPTION(ENABLE_GCOV "Enable gcov" ON)
IF (ENABLE_GCOV)
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fprofile-arcs -ftest-coverage -lgcov")
ENDIF()
编译成功后,运行可执行文件,对应 .gcda 文件也将生成在 build 目录下。找到 build 目录中,.gcda 文件的位置,会发现此处存在 .gcno 文件,运行 gcov -r .,将会把对应 .gcov 文件生成到根目录下。这时,对 .gcov 所处目录运行以下指令:
gcovr -r ./ -x --object-directory={.gocv 文件所在目录绝对路径}(可以使用 $(pwd)/xxx) >coverage.xml,将会生成 sonar-scanner 可以读取的覆盖率文件。
运行 gcov {test文件.gcno路径},在根目录下会生成所有使用到的代码文件的gcov文件结果
gcovr 安装,gcc+gcov是编译时一般Linux系统都有的,而gcovr是一个需要额外安装的gcov报告格式化的工具,它比lcov更好的一个场景是提供了cobetura兼容格式的xml报告。从而可以让sonar来解析c++的覆盖率报告。
在联网环境下,gcovr可以直接采取
注:gcovr 在 linux 服务器上离线安装,需要提前下载三个依赖库 .whl 文件(jinja2、lxml、pygments,其中lxml和python版本的匹配要求很高,我下载到第四个版本才成功安装,最终配置环境为 python 3.8.17 + lxml 4.6.3)。新版本 python 将无需提前下载 pip 和 setup 库,无 root 权限需要配置新 python 环境路径,通过 python3 和 pip3 进行调用。
8.9版本,需要在 sonar-project.properties 配置参数 sonar.cxx.cobetura.reportPaths(也可以在网页端 projects -> general settings -> cxx external analysis 中配置)
看不到任何安全热点:
1. 未激活安全漏洞检测
2. 未使用任何安全敏感api
注:默认的 vulnerability 检验规则较少,所以一般都显示为0
参考资料:
https://blog.csdn.net/weixin_45137861/article/details/97270856
https://blog.csdn.net/qq_43958699/article/details/115986320