【问题标题】:cannot generate XML output from cppcheck无法从 cppcheck 生成 XML 输出
【发布时间】:2012-05-23 13:42:44
【问题描述】:

我正在使用cppcheck 对 C 代码进行静态分析,但似乎无法获得 XML。我要求 Jenkins 使用 XML 文件

这是我迄今为止尝试过的:

runcppcheck.sh

#!/bin/sh
cd obj/msc
cppcheck --enable=all -I. -I. -I. -I. -I. -I. -I. -I. -I. -I. -I. /usr/include/ -I. obj/fap/ \
-DSUNOS -DSS -DSS_MT -DANSI -D_GNU_SOURCE -DSS_LINUX -D_REENTRANT -D__EXTENSIONS__ -DSUNOS -DCNS_PH1 -DDBG_TIMESTAMP -DLX_PRNT_TIMESTAMP \
-DDEBUGP -DLX -DLCLXT -DLXT_V1 -DLCLXUILXT -DLCXULILXT -DXU  -DLX -DLCLLX  -DSM -DLWLCLLX -DLCLXMILLX -DLCSMLXMILLX -DHR -DLX -DLCHRT \
-DLCHRUIHRT -DLCHRLIHIT -DLCLXLIHRT -DXU -DLCXULIHRT  -DLX -DLX_RTP -DLX_FASTRC -DCMINET_BSDCOMPAT -DSS_TICKS_SEC=100 -DCMFILE_REORG_1 \
-DCM_INET2 -D_GNU_SOURCE -DCMFILE_REORG_2 -DSSINT2 -DCMKV2 -DHI_MULTI_THREADED -DxCM_PASN_DBG -DxCCPU_DEBUG -DxRNC_OUTPUT_CONSOLE \
-DxCCPU_DEBUG_TRACE -DCCPU_DEBUG1 -DSS_PERF -DNO_ERRCLS -DNOERRCHK -DSS_M_PROTO_REGION -DxCCPU_DEBUG_TRACE1 -DxCCPU_DEBUG_TRACE2 \
-DCCPU_MEAS_CPU -DSTD_CCPU_IU -UMULTIPLE_CN_SUPPORT -DLONG_MSG -DTEST_CNS -UDCM_RTP_SESSID_ARRAY -DHR *.c *.h --xml ../../cppcheck-result.xml

我确实在标准输出上获取 XML,但不是在文件中

【问题讨论】:

    标签: cppcheck


    【解决方案1】:

    我是一名 Cppcheck 开发人员。

    您需要将报告通过管道传输到文件中。

    cppcheck file1.c --xml 2> cppcheck-result.xml
    

    关于命令行的一个小提示,在大多数情况下,最好使用 . 而不是 *.c *.h

    【讨论】:

    • 我使用了 "cppcheck file1.c --xml 2>&1 | tee test2.xml" 任何 cmets
    • 嗯。出于某种原因,我无法让它工作(在 Windows 7 下,如果这很重要的话)。当将其输出到如上所示的 .xml 文件时,输出文件将仅包含有关正在处理哪些文件和进度的信息,而不是 xml 输出(我确实看到了,但仅在控制台窗口中看到)。跨度>
    • 根据manual, Chapter 4,您应该更喜欢新的XML标准--xml-version=2,而不是--xml
    • @Leif 你可能已经修复了它或者现在不在乎,但你需要使用cppcheck ... 2>my.xml 而不是cppcheck ... > my.xml 进行管道传输
    • @Pierre.Sassoulas 谢谢 - 它可能对其他来这里的人有用,但我不记得当时我想做什么。
    【解决方案2】:

    实际上,这里是获取正确 xml 输出的命令。

    cppcheck --xml --xml-version=2 --enable=all <path1> <path2> 2>samplecppcheck.xml
    

    【讨论】:

    • 根据manual,您不需要--xml,只需--xml-version=2
    【解决方案3】:

    2&gt; 部分显然是 shell 语法,并且仅适用于 shell 解释器的上下文。那么,如果不是从 shell 运行,只是一个普通的“带参数的命令”类型的接口(如envxargsdocker run 等),该怎么办?

    不用说,显而易见的解决方法,将整个东西包装在 sh -c 中,是一种可怕的反模式:引用和转义很难正确执行,大多数程序员甚至不会尝试,导致代码脆弱和一个潜在的安全漏洞。这将是指定输出文件的不合理的复杂性,并且清楚地表明您做错了。

    包装脚本让您以正确的方式解决问题

    #!/bin/sh
    exec "$@" 2> result.xml
    

    ……但那将是一个文件,这本身可能是一个复杂的问题。幸运的是,该脚本可以写成这样的内联形式:

    sh -c 'exec "$0" "$@" 2> result.xml' cppcheck …
    

    这现在是一个普通参数列表的形式,因此适用于所有 shell,以及像 docker run 这样的非 shell。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 2015-05-26
      • 2017-02-06
      • 1970-01-01
      相关资源
      最近更新 更多