From e58ce527c64c3a98fe9c1c73ede7ebd17e308a1b Mon Sep 17 00:00:00 2001 From: WerWolv Date: Thu, 10 Jul 2025 13:55:05 +0200 Subject: [PATCH] build: Add support for cppcheck to cmake --- CMakeLists.txt | 1 + cmake/build_helpers.cmake | 26 ++++++++++++++++++++++++++ cmake/modules/ImHexPlugin.cmake | 1 + dist/cppcheck.supp | 20 ++++++++++++++++++++ lib/libimhex/CMakeLists.txt | 2 ++ main/gui/CMakeLists.txt | 1 + 6 files changed, 51 insertions(+) create mode 100644 dist/cppcheck.supp diff --git a/CMakeLists.txt b/CMakeLists.txt index 140c40d98..d85058620 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -25,6 +25,7 @@ option(IMHEX_ENABLE_IMGUI_TEST_ENGINE "Enable the ImGui Test Engine" option(IMHEX_ENABLE_PRECOMPILED_HEADERS "Enable precompiled headers" OFF) option(IMHEX_COMPRESS_DEBUG_INFO "Compress debug information" ON ) option(IMHEX_ENABLE_CXX_MODULES "Enable C++20 Module compilation. Testing only!" OFF) +option(IMHEX_ENABLE_CPPCHECK "Enable cppcheck static analysis" OFF) set(IMHEX_BASE_FOLDER "${CMAKE_CURRENT_SOURCE_DIR}") set(CMAKE_MODULE_PATH "${IMHEX_BASE_FOLDER}/cmake/modules") diff --git a/cmake/build_helpers.cmake b/cmake/build_helpers.cmake index f3f88ca6b..55f1f9799 100644 --- a/cmake/build_helpers.cmake +++ b/cmake/build_helpers.cmake @@ -66,6 +66,32 @@ function(addCommonFlag) addObjCFlag(${ARGV0} ${ARGV1}) endfunction() +function(addCppCheck target) + if (NOT IMHEX_ENABLE_CPPCHECK) + return() + endif() + + find_program(cppcheck_exe NAMES cppcheck REQUIRED) + if (NOT cppcheck_exe) + return() + endif() + + set(target_build_dir $) + set(cppcheck_opts + --enable=all + --inline-suppr + --quiet + --std=c++23 + --check-level=exhaustive + --error-exitcode=10 + --suppressions-list=${CMAKE_SOURCE_DIR}/dist/cppcheck.supp + --checkers-report=${target_build_dir}/cppcheck-report.txt + ) + set_target_properties(${target} PROPERTIES + CXX_CPPCHECK "${cppcheck_exe};${cppcheck_opts}" + ) +endfunction() + set(CMAKE_WARN_DEPRECATED OFF CACHE BOOL "Disable deprecated warnings" FORCE) include(FetchContent) diff --git a/cmake/modules/ImHexPlugin.cmake b/cmake/modules/ImHexPlugin.cmake index 73e14bc59..8e19e3fb8 100644 --- a/cmake/modules/ImHexPlugin.cmake +++ b/cmake/modules/ImHexPlugin.cmake @@ -56,6 +56,7 @@ macro(add_imhex_plugin) # Enable required compiler flags enableUnityBuild(${IMHEX_PLUGIN_NAME}) setupCompilerFlags(${IMHEX_PLUGIN_NAME}) + addCppCheck(${IMHEX_PLUGIN_NAME}) # Configure build properties set_target_properties(${IMHEX_PLUGIN_NAME} diff --git a/dist/cppcheck.supp b/dist/cppcheck.supp new file mode 100644 index 000000000..0dcd54ef2 --- /dev/null +++ b/dist/cppcheck.supp @@ -0,0 +1,20 @@ +missingIncludeSystem +constParameter +unusedFunction +preprocessorErrorDirective +checkersReport +noExplicitConstructor +unmatchedSuppression +useInitializationList +useStlAlgorithm +knownConditionTrueFalse +internalAstError +unsignedPositive +variableScope +unusedPrivateFunction +constParameterCallback + +*:*/lib/third_party/* +*:*/external/pattern_language/external/* +*:*/external/disassembler/external/* +*:*/lib/libimhex/source/ui/imgui_imhex_extensions.cpp \ No newline at end of file diff --git a/lib/libimhex/CMakeLists.txt b/lib/libimhex/CMakeLists.txt index 6e11afab3..97b126c43 100644 --- a/lib/libimhex/CMakeLists.txt +++ b/lib/libimhex/CMakeLists.txt @@ -97,6 +97,8 @@ else() target_compile_definitions(libimhex PRIVATE IMHEX_PROJECT_NAME="${PROJECT_NAME}") endif() +addCppCheck(libimhex) + if (DEFINED IMHEX_COMMIT_HASH_LONG AND DEFINED IMHEX_COMMIT_BRANCH) set(GIT_COMMIT_HASH_LONG "${IMHEX_COMMIT_HASH_LONG}") diff --git a/main/gui/CMakeLists.txt b/main/gui/CMakeLists.txt index d1d7cd7fa..10d4c40eb 100644 --- a/main/gui/CMakeLists.txt +++ b/main/gui/CMakeLists.txt @@ -28,6 +28,7 @@ add_executable(main ${APPLICATION_TYPE} ) target_include_directories(main PUBLIC include) +addCppCheck(main) setupCompilerFlags(main) setupCompilerFlags(libimhex)