2012-05-16 55 views
6

我正在使用cppcheck進行C代碼的靜態分析,但似乎無法獲得XML。我需要的XML文件詹金斯無法從cppcheck生成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,但只是不文件

回答

7

我是Cppcheck開發人員。

您需要將報告傳送到文件。

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

關於您的命令行的一個小提示,在大多數情況下,最好使用而不是* .c * .h

+0

我用「cppcheck file1.c --xml 2>&1 | tee test2.xml」有任何意見 – kamal

+0

好主意。應該工作 –

+1

嗯。出於某種原因,我無法讓這個工作(在Windows 7下,如果這很重要)。如上所示,當將輸出文件輸出爲.xml文件時,輸出文件將僅包含有關正在處理哪些文件和進度的信息,而不是xml輸出(我確實看到,但僅在控制檯窗口中)。 – Leif

2

其實,這裏是獲取正確的xml輸出的命令。

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

根據[manual](http://cppcheck.sourceforge.net/manual.pdf),您不需要'--xml',只需要'--xml-version = 2'。 – phoenix

0

2>部分顯然是外殼語法,而只是爲了從shell解釋的情況下工作。那麼,如果不從shell運行,只是一個普通的「帶參數的命令」類型的接口(如env,xargs, docker run等),該怎麼辦?不用說,明顯的解決方法,在sh -c包裝整個事情,是一個可怕的反模式:引用和轉義很難做到正確,大多數程序員甚至不會嘗試,導致脆弱的代碼和一個潛在的安全漏洞。這對於指定一個輸出文件來說是一個不合理的複雜情況,並且清楚地表明你做錯了什麼。

一個包裝腳本,讓你解決問題的正確方法

#!/bin/sh 
exec "[email protected]" 2> result.xml 

...但是這將是一個文件,這可能是一個複雜的本身。幸運的是,該腳本可以寫成一個內嵌的形式是這樣的:

sh -c 'exec "$0" "[email protected]" 2> result.xml' cppcheck … 

現在這是在一個普通的參數列表的形式,因此在所有的shell工作,以及非殼狀docker run