2012-05-16 18 views
6

Tôi đang sử dụng cppcheck để phân tích tĩnh Mã C, nhưng dường như không thể nhận được XML. Tôi yêu cầu các tập tin XML để được tiêu thụ bởi Jenkinskhông thể tạo đầu ra XML từ cppcheck

Dưới đây là những gì tôi đã cố gắng cho đến nay:

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 

i DO GET XML trên stdout, nhưng chỉ trong một KHÔNG file

Trả lời

7

Tôi là một nhà phát triển Cppcheck.

Bạn cần đưa báo cáo vào tệp.

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

Một gợi ý nhỏ về dòng lệnh của bạn, trong hầu hết các trường hợp, tốt hơn nên sử dụng . thay vì * .c * .h.

+0

tôi đã sử dụng "tệp cppcheck1.c --xml 2> & 1 | tee test2.xml" bất kỳ nhận xét nào – kamal

+0

ý tưởng hay. nên làm việc –

+1

Hmmm. Vì lý do nào đó, tôi không thể làm việc này (trong Windows 7, nếu vấn đề đó xảy ra). Khi đường dẫn nó ra tệp .xml như được hiển thị ở trên, tệp đầu ra sẽ chỉ chứa thông tin về tệp đang được xử lý và tiến trình, không phải đầu ra xml (mà tôi thấy, nhưng chỉ trong cửa sổ bảng điều khiển). – Leif

2

Thực ra, đây là lệnh để có được kết xuất xml thích hợp.

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

Mỗi [thủ công] (http://cppcheck.sourceforge.net/manual.pdf), bạn không cần '--xml', chỉ cần' --xml-version = 2'. – phoenix

0

Đó 2> phần rõ ràng là vỏ cú pháp, và chỉ có nghĩa là để làm việc từ bối cảnh của một thông dịch viên vỏ. Vì vậy, phải làm gì khi KHÔNG chạy từ trình bao, chỉ cần một loại giao diện “lệnh với đối số” đơn giản (như env, xargs, docker run và như vậy)? Nó không cần thiết để nói rằng cách giải quyết rõ ràng, bao gồm toàn bộ điều trong sh -c, là một antipattern khủng khiếp: Trích dẫn và thoát là khó để làm một cách chính xác, hầu hết các lập trình thậm chí sẽ không cố gắng, dẫn đến mã giòn và một lỗ hổng bảo mật tiềm năng. Đó sẽ là một biến chứng không hợp lý để chỉ định một tập tin đầu ra, và một dấu hiệu rõ ràng rằng bạn đang làm điều gì đó sai trái.

Một wrapper kịch bản cho phép bạn giải quyết vấn đề một cách đúng đắn

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

... nhưng đó sẽ là một tập tin, và đó có thể là một biến chứng của riêng mình. May mắn thay, kịch bản có thể được viết bằng một hình thức inline như thế này:

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

này hiện đang ở dạng một danh sách đối số đơn giản, và do đó làm việc trong tất cả các vỏ, cũng như phi đạn như docker run.