PAYATHON 2026

如何将 Cppcheck/Cppcheclipse 的 xml 输出生成可读报告?

排障赵师傅

结论

Cppcheclipse 正常工作时,无需把控制台中的 XML 另行转换成报告。插件会解析 Cppcheck 的 XML 输出,并将分析结果转换为 Eclipse 问题标记。结果主要在 Problems 视图中查看:

Window > Show View > Problems

有些版本还会提供单独的 Cppcheck 视图,名称因插件版本而异。

如果需要单独的 HTML 报告,Cppcheck 没有直接将 XML 转换成排版网页的参数,通常要使用 cppcheck-htmlreport 等后处理工具。这个过程不需要 LibreOffice,但属于插件之外的报告转换流程。

先确认控制台中的 XML 是什么

示例记录中没有源文件和行号,消息里还有空变量名、function 等占位内容,因此很可能是 cppcheck --errorlist 返回的“诊断类型目录”,不一定是当前工程的分析结果。

实际问题通常包含 <location>,例如:

<error
    id="bufferAccessOutOfBounds"
    severity="error"
    msg="Buffer is accessed out of bounds: buf">
    <location file="src/main.c" line="42" column="9"/>
</error>

--errorlist 的输出则类似:

<error
    id="argumentSize"
    severity="warning"
    msg="Buffer 'buffer' is too small...">
    <symbol>function</symbol>
</error>

这种输出列出的是 Cppcheck 可能产生的诊断类型,并不表示工程中确实存在这些问题。Cppcheclipse 可能会在初始化规则或配置严重级别时读取这份目录。

如果从控制台复制的内容只有若干 <error> 片段,它也不是完整的 XML 文档。完整的 Cppcheck XML 通常还包括 XML 声明以及 <results>、<errors> 等外层节点。即使补齐这些节点,XML 仍是供程序读取的交换格式,不会自动变成便于阅读的报告。

在 Eclipse 中查看分析结果

打开 Problems 视图:

Window > Show View > Problems

如果菜单中没有直接列出该视图,可以使用:

Window > Show View > Other... > General > Problems

接着检查:

  1. 清除 Problems 视图中的文本过滤器。
  2. 确认视图没有隐藏 Error、Warning 或特定资源范围。
  3. 将视图范围切换到整个工作区或当前项目。
  4. 查看对应源文件左侧是否有问题标记。
  5. 确认项目已经启用 Cppcheclipse builder 或 analysis nature,具体名称可能因插件版本而异。

如果控制台中有完整 XML,Problems 视图却没有任何标记,插件可能无法解析当前 Cppcheck 版本生成的 XML。部分 Cppcheclipse 发行版本较旧,与新版 Cppcheck 的输出格式可能不完全兼容。可以核对插件支持的 Cppcheck 版本,也可以用一个较小的测试文件检查兼容性。

能否通过附加参数生成可读文本

手动运行 Cppcheck 时,可以通过模板生成普通文本:

cppcheck --enable=all \
  --template='{file}:{line}:{column}: {severity}: {message} [{id}]' \
  src

输出通常类似:

src/main.c:42:9: error: Buffer is accessed out of bounds: buf [bufferAccessOutOfBounds]

不建议把这个模板参数直接加入 Cppcheclipse 的参数列表。插件通常会主动添加 --xml 或 --xml-version=2,并通过解析 XML 获取诊断位置。改成文本输出后,插件可能无法在 Problems 视图中创建标记。

不同用途对应的处理方式如下:

  • 在 Eclipse 中查看结果时,让插件继续使用 XML,然后到 Problems 视图中查看。
  • 手动运行 Cppcheck 时,可以用 --template 输出可读文本。
  • 如果需要独立的 HTML 文件,还要增加报告转换步骤,只有 --xml 或 --template 无法完成。

常见的 HTML 报告生成流程如下:

cppcheck --xml --xml-version=2 \
  --output-file=cppcheck.xml \
  src

cppcheck-htmlreport \
  --file=cppcheck.xml \
  --report-dir=cppcheck-report \
  --source-dir=.

cppcheck-htmlreport 是否包含在安装包中,取决于操作系统和安装方式。它不依赖 LibreOffice。如果只是日常在 Eclipse 中检查问题,通常无需生成这类报告。

如何查看插件实际使用的参数

不同版本的 Cppcheclipse 设置页面并不统一,插件也可能在运行时追加固定参数。因此,Preferences 或 Project Properties 中显示的附加参数不一定是最终使用的完整命令行。

可以依次检查:

  1. 在 Console 视图右上角的控制台列表中,选择 Cppcheck 对应的控制台。
  2. 查看插件设置中是否有 verbose、debug、show command line 或类似选项。
  3. 打开 Eclipse 错误日志:
Window > Show View > Error Log
  1. 检查工作区日志:
<workspace>/.metadata/.log

如果插件没有记录最终命令,Eclipse 通常也没有通用页面能够显示短生命周期外部进程的完整参数。需要精确确认时,可以暂时把 Cppcheck 可执行文件设置为包装脚本,由脚本记录参数后再调用真正的 cppcheck:

#!/bin/sh
printf '%s\n' "$@" >> /tmp/cppcheck-arguments.log
exec /usr/bin/cppcheck "$@"

这段脚本仅用于诊断。排查完成后,应恢复真实的 Cppcheck 路径,并将脚本中的 /usr/bin/cppcheck 替换为本机的实际路径。

再次运行没有输出时如何排查

控制台中没有 XML,并不一定表示 Cppcheck 没有运行。插件解析输出后,可能只更新 Problems 视图;进行增量分析时,也可能跳过没有变化的文件。

可以依次检查:

  1. 保存所有源文件。
  2. 确认当前打开的是 Cppcheck 控制台,而非 CDT Build Console。
  3. 查看 Problems 视图中是否还保留着上一次的标记。
  4. 清理项目并重新构建:
Project > Clean...
Project > Build Project
  1. 如果插件提供 Run Cppcheck、Check Project 或类似命令,选择检查整个项目,不要只检查已经修改的文件。
  2. 检查 Cppcheck 可执行文件路径是否有效,并确认该文件具有执行权限。
  3. 查看 Error Log 和 <workspace>/.metadata/.log,确认是否有进程启动失败、XML 解析失败或版本不兼容等错误。
  4. 使用一个确定能够触发诊断的最小文件测试插件:
int main(void)
{
    int values[2] = {0, 1};
    return values[5];
}

如果执行完整检查后仍没有输出,Problems 视图中也没有标记,应检查 builder 是否启用、项目是否禁用了插件,以及 Cppcheck 与 Cppcheclipse 的版本是否兼容。如果命令行能够从最小文件中检出问题,而插件无法检出,通常需要排查插件配置、增量构建状态和 XML 解析环节。

备注:内容仅供参考。