CppDepend 和 SonarQube 都是静态分析器,提供基于规则的系统来检测 C/C++ 代码中的问题。然而,CppDepend 的默认规则集与 SonarQube 的规则重叠很少
。基本上,SonarQube 规则擅长分析方法内部发生的事情——代码流——而 CppDepend 规则所基于的 CppDepend 代码模型,则针对更高层次领域的 360° 视图进行了优化,包括面向对象编程、依赖关系、度量、破坏性变更、可变性、命名等。
具体来说,SonarQube 规则可以就可能为空的引用等问题发出警告,而 CppDepend 可以就过于复杂的类或组件向您发出警告,并就如何重构以使代码更简洁、更易维护提供建议。让 CppDepend 规则系统独树一帜的另一点是编写自定义规则有多么容易。使用 CppDepend,规则就是一条查询专为代码质量设计的代码模型的 LINQ 查询,在 Visual Studio 中实时编辑,并在您编辑的同时实时编译和执行。具体来说,下面这段代码就是一条功能完整的规则——还能更简单吗?
// <Name>类必须以 I 开头</Name>
warnif 数量 > 0
应用.Types.Where(t => t.IsClass && !t.SimpleName.StartsWith("C"))
使用 CppDepend 定义自定义规则时,用户不需要创建项目、创建源文件、进入编辑/编译/调试循环,也不需要维护一个需要费心共享、版本管理和集成的二进制 DLL。使用 CppDepend,自定义规则就是纯文本,以 XML CDATA 的形式嵌入到 CppDepend 项目或规则文件中。此外,文档和修复指南也可以作为注释嵌入到规则源代码中。

此外,每条 CppDepend 规则都可以附带额外数据来呈现其问题,帮助您理解并修复问题。而且,每条规则都可以嵌入两个公式,用于估算修复问题的成本和问题的让问题遗留下来不修复的年度成本,也称为技术债务和问题的年度利息。由于这些公式依赖于修复问题时真正重要的因素,它们使债务估算更有意义。
最后,使用 CppDepend,即使在大型代码库上,每条规则也只需几毫秒就能运行完成。因此,所有规则都可以在几秒钟内运行完毕(在真实代码库上通常是 2 到 3 秒),无论是在 Visual Studio 中还是在持续集成系统中。这样做的好处是,在每次编译后和签入时,开发者都能立即知道自基线以来新增和修复的问题,以及在技术债务方面的解决或新增情况。现在,让我们来解释如何将 CppDepend 规则结果集成到 SonarQube 系统中,以结合两个产品的优势。
一、C/C++ 插件先决条件
- 安装SonarQube。
- 安装SonarQube Scanner或旧版Sonar Runner。
- 将 SonarQube Scanner 或 SonarRunner 的 bin 目录添加到 PATH 环境变量中。
二、插件安装与配置
- 将 $CppDependInstallDir$/SonarPlugin 中的 sonar-cxx-plugin-cppdepend-1.0 复制到 $SonarQubeInstallDir$\extensions\plugins 目录,然后重启 SonarQube。
- 默认的 CppDepend 规则会被加载到 SonarQube 规则库中。不过,如果您需要自定义这些规则,可以使用位于 SonarQube 管理选项卡下的 .cdproj 文件路径来定义自己的自定义规则。

- 您需要以管理员身份登录,并在您想要的配置文件中激活 CppDepend 规则。

- 执行 $CppDependInstallDir$/SonarRunnerForCppDepend.exe "要分析的 .cdproj 文件"。例如:SonarRunnerForCppDepend.exe C:\MyWorkspace\test.cdproj。SonarRunnerForCppDepend 将使用 CppDepend 分析 cdproj 文件,并启动 SonarQube Scanner 可执行文件,将结果加载到 SonarQube 中。在 cdproj 文件参数之后传递给 SonarRunnerForCppDepend 的任何其他参数都将传递给 SonarScanner 命令。例如,您可以使用此命令传递版本号:SonarRunnerForCppDepend.exe C:\MyWorkspace\test.cdproj -Dsonar.projectVersion=3.0
三、插件特性
- 多模块分析:一个 CppDepend 项目可以包含许多 C/C++ 项目。分析完成后,CppDepend 不会把所有代码放进同一个 SonarQube 模块;相反,它会创建一个多模块的 SonarQube 项目,将每个项目隔离到单独的模块中,使代码导航变得更加容易。

- 问题:CppDepend 默认提供超过 250 条规则,您可以轻松地完全自定义它们。CppDepend 提供了一种强大的方式来计算问题的技术债务。CppDepend 的技术债务和问题严重程度会被传递给 SonarQube。

- 标准度量:该插件计算所有标准的 SonarQube 度量。

- 代码重复:重复代码由 SonarQube 内嵌的 CPD 工具检测。

- 覆盖率:该插件从 Cobertura 和 Microsoft Visual Studio XML 结果文件加载覆盖率结果。不过,您需要设置 XML 覆盖率文件所在的路径。


结论
C/C++ SonarQube 插件易于安装和使用,规则自定义也非常简单。您可以试用一下并向我们反馈意见。
