cppcheck
« | 23 Feb 2025 | »Der Compiler ist nicht genug!
Nicht erst seit der Rust Bedrohung braucht C++ Code jedes Codereview, das es kriegen kann.
cppcheck war und ist “das” Standard-Tool, dass hier den Anfang macht.
Statische Code-Analyse hilft Fehler zu erkennen, die Entwicklung und
Compiler nicht als solche ansehen.
Es macht also Sinn den eigenen Code durch möglichst viele Tests zu jagen
und Fehlermeldung und Hinweise einzusammeln.
cppcheck erkennt viele Formfehler wie uninitialisierte Variablen, oder
“seltsam” aussehende Blockverzweigungen und noch vieles mehr.
Ich habe das Tool daher als CMake-Custom-Target eingebaut, womit ich es
während der Entwicklung immer wieder direkt per VSCode-Klick ausführen
kann um Verbesserunen oder Verschlechterungen in neuem Code zu erkennen.
cppcheck als CMake Target
Ein Code sagt mehr als tausend Worte:
1 2if(CMAKE_HOST_WIN32) 3 find_program(CPPCHECK_APP 4 NAMES "cppcheck" 5 PATHS "C:\\Program Files\\Cppcheck" "C:\\Program Files (x86)\\Cppcheck" "C:\\Cppcheck") 6else() 7 find_program(CPPCHECK_APP cppcheck) 8endif() 9 10if(CPPCHECK_APP) 11 12 option(CPPCHECK_CMAKE_TARGETS "Adds a CPPCHECK targets to analyze code quality" ON) 13 set(CPPCHECK_SOURCE_DIR "${CMAKE_SOURCE_DIR}" CACHE FILEPATH "CPPCHECK source scan directory") 14 set(CPPCHECK_RESULTS_XML_FILE "${CMAKE_BINARY_DIR}/cppcheck_results.xml" CACHE FILEPATH "CPPCHECK results output file") 15 set(CPPCHECK_RESULTS_HTML_DIR "${CMAKE_BINARY_DIR}/cppcheck_report" CACHE PATH "CPPCHECK HTML report output directory") 16 17 if(CPPCHECK_CMAKE_TARGETS) 18 19 set(CPPCHECK_CMD "${CPPCHECK_APP}" 20 --enable=all --language=c++ --std=c++11 21 --suppress=cstyleCast 22 --xml --xml-version=2 -j 8 . 2> "${CPPCHECK_RESULTS_XML_FILE}" 23 ) 24 25 ## add CPPCHECK process execution target 26 add_custom_target(cppcheck_execute 27 COMMAND ${CPPCHECK_CMD} 28 WORKING_DIRECTORY "${CPPCHECK_SOURCE_DIR}" 29 COMMENT "Running cppcheck..." 30 ) 31 32 file(MAKE_DIRECTORY "${CPPCHECK_RESULTS_HTML_DIR}") 33 34 set(CPPCHECK_REPORT_CMD cppcheck-htmlreport 35 "--title=${PROJECT_NAME}" 36 --source-dir=. 37 "--file=${CPPCHECK_RESULTS_XML_FILE}" 38 "--report-dir=${CPPCHECK_RESULTS_HTML_DIR}" 39 ) 40 41 ## add CPPCHECK HTML report generation target 42 add_custom_target(cppcheck_generate_report 43 COMMAND ${CPPCHECK_REPORT_CMD} 44 WORKING_DIRECTORY "${CPPCHECK_SOURCE_DIR}" 45 COMMENT "Generating cppcheck html report" 46 ) 47 endif(CPPCHECK_CMAKE_TARGETS) 48endif()
Hier werden zwei zusätzlich Targets angelegt:
cppcheck_executeführtcppcheckaus und generatiert die XML-Datei mit gefundenen Problemen.cppcheck_generate_reportlässt über das Toolcppcheck-htmlreportaus der XML Datei eine HTML Seite generieren.
Natürlich müssen beide Tools im Vorfeld im System installiert sein, damit sie auch gefunden und ausgeführt werden können.
In Visual Studio Code erscheinen die beiden Targets im CMake Fenster im
Project Outline und können jeweils per Klick gestartet werden.
Fazit
Natürlich könnte man die beiden Tool-Ausführungen in ein Custom-Target
zusammenfassen, um nur noch einen Klick zu brauchen.
Der Hintergrund für Trennung war Windows, denn die Standard-Installation
von cppcheck führt dort html-report Tool nicht mit. Linux Paketmanager
installieren aber immer beide Tools.
So konnte ich dann entscheiden, ob ich nur den ersten oder beide Schritte ausführen wollte.
Die Ergebnisse auf der HTML Seite haben mir schon oft Grund für kleine
Änderungen und Verbesserungen gegeben.
Folglich sollte eine cppcheck Auswertung in keinem Projekt mehr fehlen.