Codan 是 Eclipse CDT 內建的 C/C++ 靜態分析框架,提供基礎設施與即用檢查器。自 Eclipse Juno (2012) 起,Codan 支援整合成熟的外部分析工具(如 Cppcheck、clang_check),結合兩者優勢:獲得更完整的檢查規則,並大幅提升開發生產力。整合後可在 Codan Preferences 配置外部工具,自動呼叫並以編輯器標記顯示結果。
Preferences > C/C++ > Code Analysis 啟用/調整 Codan 內建檢查器,設定觸發時機(輸入時、開檔、存檔、增量/完整建置、手動)。File > New > Plug-in Project,命名 CppcheckChecker。MANIFEST.MF 的 Dependencies 加入必要相依:org.eclipse.cdt.codan.core、org.eclipse.cdt.codan.ui、org.eclipse.cdt.core、org.eclipse.core.resources 等。CppcheckErrorParser)實作 org.eclipse.cdt.core.IErrorParser,以正則擷取 Cppcheck 輸出:
// 輸出範例:[/src/HelloWorld.cpp:19]: (style) The scope of the variable 'i' can be reduced
private static Pattern pattern = Pattern.compile("\\[(.*):(\\d+)\\]:\\s*\\((.*)\\)\\s*(.*)");
processLine 解析檔案路徑、行號、嚴重度、描述,建立 ProblemMarkerInfo 交由 ErrorParserManager 產生編輯器標記。嚴重度對應表:
SEVERITY_MAPPING.put("error", IMarkerGenerator.SEVERITY_ERROR_RESOURCE);
SEVERITY_MAPPING.put("warning", IMarkerGenerator.SEVERITY_WARNING);
SEVERITY_MAPPING.put("style", IMarkerGenerator.SEVERITY_INFO);
於 plugin.xml 註冊 org.eclipse.cdt.core.ErrorParser,加入 <context type="codan"/> 限定僅供 Codan 使用。
CppcheckChecker)繼承 AbstractExternalToolBasedChecker,指定工具名稱、可執行檔(cppcheck)、預設參數(--enable=all)。覆寫關鍵方法:
getParserIDs() 回傳錯誤解析器 ID。addMarker(ProblemMarkerInfo) 將嚴重度映射至 Codan 問題 ID(PROBLEM_IDS),呼叫 reportProblem 產生標記。getReferenceProblemId() 指定參考問題 ID。在 plugin.xml 以 org.eclipse.cdt.codan.core.checkers 擴充點註冊:建立 Cppcheck 分類,將 Error、Warning、Style 三組問題對應三個嚴重度,皆預設啟用,訊息模式 {0} 直接使用 Cppcheck 原始描述。
重啟 Eclipse 後,Codan Preferences 將出現 CppcheckChecker,可配置執行路徑與參數。儲存檔案時自動觸發 Cppcheck 掃描,結果以標記顯示於編輯器。限制:外部工具無法即時掃描未儲存變更,故不支援「輸入時」觸發;但以約 100 行 Java + 30 行 XML 即可整合成熟工具,遠輕於自行實作完整檢查器。
Eclipse Juno 讓開發者以少量程式碼整合外部分析工具,結合 Codan 框架與 Cppcheck 等成熟掃描器,兼顧即時回饋與深度檢查,同樣流程可套用至其他工具。