cppcheck

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_execute führt cppcheck aus und generatiert die XML-Datei mit gefundenen Problemen.
  • cppcheck_generate_report lässt über das Tool cppcheck-htmlreport aus 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.

📧 📋 🐘 | 🔗 🔔
 

Meine Dokus über:
 
Weitere externe Links zu:
Alle extern verlinkten Webseiten stehen nicht in Zusammenhang mit opengate.at.
Für deren Inhalt wird keine Haftung übernommen.



Wenn sich eine triviale Erkenntnis mit Dummheit in der Interpretation paart, dann gibt es in der Regel Kollateralschäden in der Anwendung.
frei zitiert nach A. Van der Bellen
... also dann paaren wir mal eine komplexe Erkenntnis mit Klugheit in der Interpretation!