前提・実現したいこと
GUI版Cppcheckの一覧画面にはID列を表示することができます。
このID値は、解析内容をグルーピングして確認するのに有用です。
一覧画面のID列ヘッダクリックにてID順に並び替えられますが、ファイルをまたいで並び替えができないようです。
複数ファイルにまたがってID順にソートして内容を確認したいです。
実行環境はWindows10x64
です。
試したこと
・結果を.csv
出力できるが、ID列は出力されない。
・同じく.xml
出力でき、こちらではIDが属性値として出力されることが確認できたが、.xml
なのでエディタなどでも確認しずらい。
2017/02/22時点の調査結果
・一覧の表示設定なりで「ファイルをまたいで並び替え」ができないか?
→ヘルプを確認した限り、できない。
・CSV出力の設定なりでID列を出力できないか?
→回答をうけ、cppcheck.exeにて解析結果を任意フォーマットで出力できることが確認できました。
・CppCheckで出力された.xml
を見やすい表形式にできないか?(すでにそんなツールはないか?)
→ヘルプ(Chapter 11. HTML report)にHtmlにて出力できるpythonツールがある旨の記載あり。動作は未確認。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答3件
0
ベストアンサー
・CppCheckで出力された.xmlを見やすい表形式にできないか?(すでにそんなツールはないか?)
PowerShellを使用して、XMLデータをCSV化してみてはいかがでしょう?
2行で実現できます。
PowerShell
1$xmlResult = [xml](Get-Content cppcheck.xml) 2$xmlResult.results.error | Select file,line,id,severity,msg | Export-Csv -Path cppcheck.csv -NoTypeInformation 3
【追記】
CppCheckは私もたまに使用するので、結果のXML->CSV変換BATを作成してみました。
「severity と id でのソート」と「msg内のエスケープ文字のデコード」処理を追加しています。
BATファイルに対して、XMLファイルをドロップすれば、同じ場所にCSVファイるが出力されます。
ご参考までに。
※ BATファイル内にPowerShellスクリプト埋め込むテクニックを使用しているので、PowerShellスクリプトの位置(行数)を変更すると、正しく動作しません。
BAT
1@echo off 2 3setlocal 4 5setlocal enabledelayedexpansion 6 7title CppCheck結果 XML⇒CSV変換 8 9if "%~1"=="" goto :EXIT 10 11set SRC_FILE=%~f1 12set DST_FILE=%~dpn1.csv 13 14echo %SRC_FILE% 15 16if not exist !SRC_FILE! echo is not exist! & goto :EXIT 17 18echo ⇒ %DST_FILE% 19 20rem PowerShellScript Line 50-60 21powershell -NoLogo -NoProfile -ExecutionPolicy Unrestricted "$s=[scriptblock]::create((gc \"%~f0\" | ?{ ($_.readcount -ge 50) -and ($_.readcount -le 60) })-join \"`n\");&$s" """%SRC_FILE%""" """%DST_FILE%""" 22 23start "" "%DST_FILE%" 24 25 26:EXIT 27 28echo ------------------------------------------------------------------------------- 29echo 処理結果を確認した後、何かキーを押してください . . . 30echo. 31pause >NUL 32 33endlocal 34goto :EOF 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50# ------------------------------------------------------------------------------ 51# PowerShellScript Line 50-60 52# ------------------------------------------------------------------------------ 53Add-Type -AssemblyName System.Web 54$xmlResult = [xml](Get-Content $Args[0]) 55$xmlResult.results.error ` 56 | Select-Object file,line,severity,id,msg ` 57 | Sort-Object severity,id ` 58 | %{ $_.msg = [System.Web.HttpUtility]::HtmlDecode($_.msg); return $_ } ` 59 | Export-Csv -Path cppcheck.csv -NoTypeInformation 60# ------------------------------------------------------------------------------
投稿2017/02/22 14:53
編集2017/02/23 11:24総合スコア344
0
コマンドライン用のcppcheck.exeで、
--template='{file}:{line},{severity},{id},{message}'
という風に結果出力のフォーマットを指定してやれば可能ですよ。
GUIを使用する場合と違いその他のパラメータ指定が面倒ですが、一度BAT化してしまえば逆に再実行などは楽です。
投稿2017/02/22 11:14
総合スコア344
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
KenjiToriumiさんから回答いたたいだXML中の文字参照を実体に変換する処理を加えて
cppcheck
解析結果の.xml
を.tsv
(タブ区切り)に変換するスクリプトが作成できました。
GUI版とCUI版で出力XML構造が異なっていたので、それにも対応してみました。
.xml
ファイルをこの.bat
ファイルにドロップすることで同名の.ps1
ファイルへ処理を渡す。
@echo off rem ---------------------------------------------------------------------------- rem cppcheckで出力されたXMLをTSVに変換する rem 変換はPowerShecllで行う。 rem PowerShellスクリプトファイル(.ps1)にファイルをドラッグ&ドロップして処理する rem http://qiita.com/harry0000/items/e8c35b8e53cdae513d9d powershell -ExecutionPolicy Unrestricted -File %~dpn0.ps1 %*
実処理を行う.ps1
ファイル。
PowerShell
1# cppcheckの解析結果.xmlを.tsvに変換する 2# 3Add-Type -AssemblyName System.Web 4 5$xmlPath = "" 6if( $args.Length -ge 1){ 7 $xmlPath = $args[0] 8} 9if( $xmlPath.Length -le 0){ 10 Write-Host "対象xmlが指定されていません。" 11 exit 0 12} 13 14$tsvPath = $xmlPath + ".tsv" 15 16Write-Host "対象xml:" $xmlPath 17Write-Host "出力tsv:" $tsvPath 18 19$xmlRes = [xml](Get-Content $xmlPath) 20 21# CUIから出力されたXML <errors>内に<error>がある。file,lineは<location>内にある。 22# <errors><error id="~"><location file="~" line="~"></location><location ~></location>~</errors> 23if( $xmlRes.results.errors){ 24 $data = $xmlRes.results.errors.error | Select @{Name="file"; Expression={$_.FirstChild.file}},@{Name="line"; Expression={$_.FirstChild.line}},id,severity,@{Name="msg"; Expression={[System.Web.HttpUtility]::HtmlDecode($_.msg)}} 25} 26# GUIから出力されたXML file,line,idは<error>内にある。 27# <error id="~" file="~" line="~"></error><error>~ 28else{ 29 $data = $xmlRes.results.error | Select file,line,id,severity,@{Name="msg"; Expression={[System.Web.HttpUtility]::HtmlDecode($_.msg)}} 30} 31#echo ($data | Select file,line,id,severity,msg) 32 33# TSV出力 34$data | Export-Csv -Path $tsvPath -NoTypeInformation -Delimiter "`t" 35 36Read-Host "終了しました。Enterキー入力してください。"
投稿2017/02/23 13:45
総合スコア38352
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/02/23 00:33
2017/02/23 13:33
2017/02/23 13:48