diff --git a/.github/workflows/selfcheck.yml b/.github/workflows/selfcheck.yml index 9ef696858eb..6241f3851d7 100644 --- a/.github/workflows/selfcheck.yml +++ b/.github/workflows/selfcheck.yml @@ -58,6 +58,7 @@ jobs: CC: clang-14 CXX: clang++-14 + # unusedFunction - start - name: CMake run: | cmake -S . -B cmake.output -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=ON -DUSE_QT6=On -DWITH_QCHART=ON -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On @@ -79,8 +80,11 @@ jobs: env: DISABLE_VALUEFLOW: 1 UNUSEDFUNCTION_ONLY: 1 + # unusedFunction - end # the following steps are duplicated from above since setting up the build node in a parallel step takes longer than the actual steps + + # unusedFunction notest - start - name: CMake (no test) run: | cmake -S . -B cmake.output.notest -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=Off -DBUILD_GUI=ON -DUSE_QT6=On -DWITH_QCHART=ON -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On @@ -100,6 +104,49 @@ jobs: env: DISABLE_VALUEFLOW: 1 UNUSEDFUNCTION_ONLY: 1 + # unusedFunction notest - end + + # unusedFunction notest nogui - start + - name: CMake (no test / no gui) + run: | + cmake -S . -B cmake.output.notest_nogui -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=Off -DENABLE_CHECK_INTERNAL=On + + - name: Generate dependencies (no test / no gui) + run: | + # make sure the precompiled headers exist + make -C cmake.output.notest_nogui lib/CMakeFiles/cppcheck-core.dir/cmake_pch.hxx.cxx + + # TODO: find a way to report unmatched suppressions without need to add information checks + - name: Self check (unusedFunction / no test / no gui) + run: | + ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib -D__CPPCHECK__ -D__GNUC__ --enable=unusedFunction --exception-handling -rp=. --project=cmake.output.notest_nogui/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr + env: + DISABLE_VALUEFLOW: 1 + UNUSEDFUNCTION_ONLY: 1 + # unusedFunction notest nogui - end + + # unusedFunction notest nocli - start + - name: CMake (no test / no cli) + run: | + cmake -S . -B cmake.output.notest_nocli -G "Unix Makefiles" -DHAVE_RULES=On -DBUILD_TESTS=Off -DBUILD_CLI=Off -DBUILD_GUI=ON -DUSE_QT6=On -DWITH_QCHART=ON -DENABLE_CHECK_INTERNAL=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On + + - name: Generate dependencies (no test / no cli) + run: | + # make sure the precompiled headers exist + make -C cmake.output.notest_nocli lib/CMakeFiles/cppcheck-core.dir/cmake_pch.hxx.cxx + # make sure auto-generated GUI files exist + make -C cmake.output.notest_nocli autogen + make -C cmake.output.notest_nocli gui-build-deps + + # TODO: find a way to report unmatched suppressions without need to add information checks + - name: Self check (unusedFunction / no test / no cli) + if: false # TODO: the findings are currently too intrusive + run: | + ./cppcheck -q --template=selfcheck --error-exitcode=1 --library=cppcheck-lib --library=qt -D__CPPCHECK__ -D__GNUC__ -DQT_VERSION=0x060000 -DQ_MOC_OUTPUT_REVISION=68 -DQT_CHARTS_LIB -DQT_MOC_HAS_STRINGDATA --enable=unusedFunction --exception-handling -rp=. --project=cmake.output.notest_nocli/compile_commands.json --suppressions-list=.selfcheck_unused_suppressions --inline-suppr + env: + DISABLE_VALUEFLOW: 1 + UNUSEDFUNCTION_ONLY: 1 + # unusedFunction notest nocli - end - name: Fetch corpus run: | @@ -113,7 +160,7 @@ jobs: - name: Generate dependencies (corpus) run: | # make sure the precompiled headers exist - make -C cmake.output.notest lib/CMakeFiles/cppcheck-core.dir/cmake_pch.hxx.cxx + make -C cmake.output.corpus lib/CMakeFiles/lib_objs.dir/cmake_pch.hxx.cxx # make sure auto-generated GUI files exist make -C cmake.output.corpus autogen make -C cmake.output.corpus gui-build-deps diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 38a060df0d3..3859d35a13c 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -1,86 +1,89 @@ -file(GLOB hdrs "*.h") -file(GLOB srcs "*.cpp") -file(GLOB mainfile "main.cpp") -list(REMOVE_ITEM srcs ${mainfile}) +if (BUILD_CLI) -add_library(cli_objs OBJECT ${hdrs} ${srcs}) -target_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/lib/) -if(USE_BUNDLED_TINYXML2) - target_externals_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/externals/tinyxml2/) -else() - target_include_directories(cli_objs SYSTEM PRIVATE ${tinyxml2_INCLUDE_DIRS}) -endif() -target_externals_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/externals/simplecpp/) -if (NOT CMAKE_DISABLE_PRECOMPILE_HEADERS) - target_precompile_headers(cli_objs PRIVATE precompiled.h) -endif() -if (BUILD_CORE_DLL) - target_compile_definitions(cli_objs PRIVATE CPPCHECKLIB_IMPORT TINYXML2_IMPORT) -endif() + file(GLOB hdrs "*.h") + file(GLOB srcs "*.cpp") + file(GLOB mainfile "main.cpp") + list(REMOVE_ITEM srcs ${mainfile}) -if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 13) - # false positive warning in Clang 13 - caused by FD_ZERO macro - set_source_files_properties(processexecutor.cpp PROPERTIES COMPILE_FLAGS -Wno-reserved-identifier) -endif() - -list(APPEND cppcheck_SOURCES ${hdrs} ${mainfile} $) -if (NOT BUILD_CORE_DLL) - list(APPEND cppcheck_SOURCES $) - list(APPEND cppcheck_SOURCES $) + add_library(cli_objs OBJECT ${hdrs} ${srcs}) + target_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/lib/) if(USE_BUNDLED_TINYXML2) - list(APPEND cppcheck_SOURCES $) + target_externals_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/externals/tinyxml2/) + else() + target_include_directories(cli_objs SYSTEM PRIVATE ${tinyxml2_INCLUDE_DIRS}) + endif() + target_externals_include_directories(cli_objs PRIVATE ${PROJECT_SOURCE_DIR}/externals/simplecpp/) + if (NOT CMAKE_DISABLE_PRECOMPILE_HEADERS) + target_precompile_headers(cli_objs PRIVATE precompiled.h) + endif() + if (BUILD_CORE_DLL) + target_compile_definitions(cli_objs PRIVATE CPPCHECKLIB_IMPORT TINYXML2_IMPORT) endif() -endif() -if (WIN32) - list(APPEND cppcheck_SOURCES version.rc) -endif() -add_executable(cppcheck ${cppcheck_SOURCES}) -target_include_directories(cppcheck PRIVATE ${PROJECT_SOURCE_DIR}/lib/) -if(USE_BUNDLED_TINYXML2) - target_externals_include_directories(cppcheck PRIVATE ${PROJECT_SOURCE_DIR}/externals/tinyxml2/) -else() - target_include_directories(cppcheck SYSTEM PRIVATE ${tinyxml2_INCLUDE_DIRS}) -endif() -target_externals_include_directories(cppcheck PRIVATE ${PROJECT_SOURCE_DIR}/externals/simplecpp/) -if (HAVE_RULES) - target_link_libraries(cppcheck ${PCRE_LIBRARY}) -endif() -if (WIN32 AND NOT BORLAND) - if(NOT MINGW) - target_link_libraries(cppcheck Shlwapi.lib) + if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_EQUAL 13) + # false positive warning in Clang 13 - caused by FD_ZERO macro + set_source_files_properties(processexecutor.cpp PROPERTIES COMPILE_FLAGS -Wno-reserved-identifier) + endif() + + list(APPEND cppcheck_SOURCES ${hdrs} ${mainfile} $) + if (NOT BUILD_CORE_DLL) + list(APPEND cppcheck_SOURCES $) + list(APPEND cppcheck_SOURCES $) + if(USE_BUNDLED_TINYXML2) + list(APPEND cppcheck_SOURCES $) + endif() + endif() + if (WIN32) + list(APPEND cppcheck_SOURCES version.rc) + endif() + + add_executable(cppcheck ${cppcheck_SOURCES}) + target_include_directories(cppcheck PRIVATE ${PROJECT_SOURCE_DIR}/lib/) + if(USE_BUNDLED_TINYXML2) + target_externals_include_directories(cppcheck PRIVATE ${PROJECT_SOURCE_DIR}/externals/tinyxml2/) else() - target_link_libraries(cppcheck shlwapi) + target_include_directories(cppcheck SYSTEM PRIVATE ${tinyxml2_INCLUDE_DIRS}) + endif() + target_externals_include_directories(cppcheck PRIVATE ${PROJECT_SOURCE_DIR}/externals/simplecpp/) + if (HAVE_RULES) + target_link_libraries(cppcheck ${PCRE_LIBRARY}) + endif() + if (WIN32 AND NOT BORLAND) + if(NOT MINGW) + target_link_libraries(cppcheck Shlwapi.lib) + else() + target_link_libraries(cppcheck shlwapi) + endif() + endif() + if(tinyxml2_FOUND AND NOT USE_BUNDLED_TINYXML2) + target_link_libraries(cppcheck ${tinyxml2_LIBRARIES}) + endif() + target_link_libraries(cppcheck ${CMAKE_THREAD_LIBS_INIT}) + if (BUILD_CORE_DLL) + target_link_libraries(cppcheck cppcheck-core) endif() -endif() -if(tinyxml2_FOUND AND NOT USE_BUNDLED_TINYXML2) - target_link_libraries(cppcheck ${tinyxml2_LIBRARIES}) -endif() -target_link_libraries(cppcheck ${CMAKE_THREAD_LIBS_INIT}) -if (BUILD_CORE_DLL) - target_link_libraries(cppcheck cppcheck-core) -endif() -add_dependencies(cppcheck copy_cfg) -add_dependencies(cppcheck copy_addons) -add_dependencies(cppcheck copy_platforms) -if (NOT DISABLE_DMAKE) - add_dependencies(cppcheck run-dmake) -endif() + add_dependencies(cppcheck copy_cfg) + add_dependencies(cppcheck copy_addons) + add_dependencies(cppcheck copy_platforms) + if (NOT DISABLE_DMAKE) + add_dependencies(cppcheck run-dmake) + endif() -install(TARGETS cppcheck - RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} - COMPONENT applications) + install(TARGETS cppcheck + RUNTIME DESTINATION ${CMAKE_INSTALL_FULL_BINDIR} + COMPONENT applications) -install(FILES ${addons} - DESTINATION ${FILESDIR}/addons - COMPONENT headers) + install(FILES ${addons} + DESTINATION ${FILESDIR}/addons + COMPONENT headers) -install(FILES ${cfgs} - DESTINATION ${FILESDIR}/cfg - COMPONENT headers) + install(FILES ${cfgs} + DESTINATION ${FILESDIR}/cfg + COMPONENT headers) -install(FILES ${platforms} - DESTINATION ${FILESDIR}/platforms - COMPONENT headers) + install(FILES ${platforms} + DESTINATION ${FILESDIR}/platforms + COMPONENT headers) +endif() \ No newline at end of file diff --git a/cmake/options.cmake b/cmake/options.cmake index a0402862dc6..90c753358b0 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -51,6 +51,8 @@ option(ENABLE_CHECK_INTERNAL "Enable internal checks" option(DISABLE_DMAKE "Disable run-dmake dependencies" OFF) option(BUILD_MANPAGE "Enable man target to build manpage" OFF) +option(BUILD_CLI "Build the cli application" ON) + option(BUILD_GUI "Build the qt application" OFF) option(WITH_QCHART "Enable QtCharts usage in the GUI" OFF) option(USE_QT6 "Prefer Qt6 when available" OFF) diff --git a/cmake/printInfo.cmake b/cmake/printInfo.cmake index c99fc205b22..bb633650b7d 100644 --- a/cmake/printInfo.cmake +++ b/cmake/printInfo.cmake @@ -58,6 +58,8 @@ message(STATUS "ENABLE_CHECK_INTERNAL = ${ENABLE_CHECK_INTERNAL}") message(STATUS "DISABLE_DMAKE = ${DISABLE_DMAKE}") message(STATUS "BUILD_MANPAGE = ${BUILD_MANPAGE}") message(STATUS) +message(STATUS "BUILD_CLI = ${BUILD_CLI}") +message(STATUS) message(STATUS "BUILD_GUI = ${BUILD_GUI}") if(BUILD_GUI) message(STATUS "REGISTER_GUI_TESTS = ${REGISTER_GUI_TESTS}") diff --git a/lib/checkleakautovar.cpp b/lib/checkleakautovar.cpp index 1cd3ffa4de5..80a3a862893 100644 --- a/lib/checkleakautovar.cpp +++ b/lib/checkleakautovar.cpp @@ -104,47 +104,6 @@ static bool isVarTokComparison(const Token * tok, const Token ** vartok, //--------------------------------------------------------------------------- -void VarInfo::print() -{ - std::cout << "size=" << alloctype.size() << std::endl; - for (std::map::const_iterator it = alloctype.cbegin(); it != alloctype.cend(); ++it) { - std::string strusage; - const auto use = possibleUsage.find(it->first); - if (use != possibleUsage.end()) - strusage = use->second.first->str(); - - std::string status; - switch (it->second.status) { - case OWNED: - status = "owned"; - break; - case DEALLOC: - status = "dealloc"; - break; - case ALLOC: - status = "alloc"; - break; - case NOALLOC: - status = "noalloc"; - break; - case REALLOC: - status = "realloc"; - break; - default: - status = "?"; - break; - } - - std::cout << "status=" << status << " " - << "alloctype='" << it->second.type << "' " - << "possibleUsage='" << strusage << "' " - << "conditionalAlloc=" << (conditionalAlloc.find(it->first) != conditionalAlloc.end() ? "yes" : "no") << " " - << "referenced=" << (referenced.find(it->first) != referenced.end() ? "yes" : "no") << " " - << "reallocedFrom=" << it->second.reallocedFromType - << std::endl; - } -} - void VarInfo::possibleUsageAll(const std::pair& functionUsage) { possibleUsage.clear(); diff --git a/lib/checkleakautovar.h b/lib/checkleakautovar.h index 1e41ce31558..225763572ed 100644 --- a/lib/checkleakautovar.h +++ b/lib/checkleakautovar.h @@ -94,8 +94,6 @@ class CPPCHECKLIB VarInfo { /** set possible usage for all variables */ void possibleUsageAll(const std::pair& functionUsage); - - void print(); }; diff --git a/lib/errorlogger.h b/lib/errorlogger.h index e936fae748f..6da1c4cade8 100644 --- a/lib/errorlogger.h +++ b/lib/errorlogger.h @@ -186,6 +186,7 @@ class CPPCHECKLIB ErrorMessage { } /** Verbose message (may be the same as the short message) */ + // cppcheck-suppress unusedFunction - used by GUI only const std::string &verboseMessage() const { return mVerboseMessage; } diff --git a/lib/importproject.cpp b/lib/importproject.cpp index 1af0fe0cc70..336e25744c8 100644 --- a/lib/importproject.cpp +++ b/lib/importproject.cpp @@ -1324,6 +1324,7 @@ void ImportProject::selectOneVsConfig(Platform::Type platform) } } +// cppcheck-suppress unusedFunction - used by GUI only void ImportProject::selectVsConfigurations(Platform::Type platform, const std::vector &configurations) { for (std::list::iterator it = fileSettings.begin(); it != fileSettings.end();) { @@ -1348,6 +1349,7 @@ void ImportProject::selectVsConfigurations(Platform::Type platform, const std::v } } +// cppcheck-suppress unusedFunction - used by GUI only std::list ImportProject::getVSConfigs() { return std::list(mAllVSConfigs.cbegin(), mAllVSConfigs.cend()); diff --git a/lib/suppressions.cpp b/lib/suppressions.cpp index aaccaff3fae..71481f324a5 100644 --- a/lib/suppressions.cpp +++ b/lib/suppressions.cpp @@ -390,6 +390,7 @@ bool SuppressionList::Suppression::isMatch(const SuppressionList::ErrorMessage & return true; } +// cppcheck-suppress unusedFunction - used by GUI only std::string SuppressionList::Suppression::getText() const { std::string ret; diff --git a/test/testcmdlineparser.cpp b/test/testcmdlineparser.cpp index 5748fc9ad27..16d47740e33 100644 --- a/test/testcmdlineparser.cpp +++ b/test/testcmdlineparser.cpp @@ -268,6 +268,7 @@ class TestCmdlineParser : public TestFixture { TEST_CASE(xmlverinvalid); TEST_CASE(doc); TEST_CASE(docExclusive); + TEST_CASE(showtimeSummary); TEST_CASE(showtimeFile); TEST_CASE(showtimeFileTotal); TEST_CASE(showtimeTop5);