From 251c5bb4bc9bb92973e738ae3c5f4ef86f103356 Mon Sep 17 00:00:00 2001 From: Rot127 <45763064+Rot127@users.noreply.github.com> Date: Thu, 13 Aug 2026 10:29:27 +0000 Subject: [PATCH] Add Valgrind cmake tests. (#3030) --- .github/workflows/CITest.yml | 24 ++++++++++++------------ .github/workflows/CrossBuilds.yml | 12 ++++++------ CMakeLists.txt | 1 + suite/cstest/CMakeLists.txt | 19 +++++++++++++++++++ suite/cstest/test/CMakeLists.txt | 8 ++++++++ tests/integration/CMakeLists.txt | 5 ++++- 6 files changed, 50 insertions(+), 19 deletions(-) diff --git a/.github/workflows/CITest.yml b/.github/workflows/CITest.yml index 9341bf274..331740e74 100644 --- a/.github/workflows/CITest.yml +++ b/.github/workflows/CITest.yml @@ -120,6 +120,11 @@ jobs: wget https://github.com/groundx/capstonefuzz/raw/master/corpus/corpus-libFuzzer-capstone_fuzz_disasmnext-latest.zip unzip -q corpus-libFuzzer-capstone_fuzz_disasmnext-latest.zip -d suite/fuzz + - name: Install test dependencies + run: | + sudo apt-get -y update + sudo apt-get -y install valgrind + - name: make if: startsWith(matrix.config.build-system, 'make') run: | @@ -167,12 +172,12 @@ jobs: - name: unit tests if: startsWith(matrix.config.build-system, 'cmake') run: | - ctest --test-dir build --output-on-failure -R unit_* + ctest --test-dir build --output-on-failure -R "^unit_*" - name: "Integration tests" if: startsWith(matrix.config.build-system, 'cmake') && matrix.config.diet-build == 'OFF' run: | - ctest --test-dir build --output-on-failure -R integration_* + ctest --test-dir build --output-on-failure -R "^integration_*" - name: cstool - reaches disassembler engine run: | @@ -191,22 +196,22 @@ jobs: - name: cstest MC if: startsWith(matrix.config.build-system, 'cmake') run: | - ctest --test-dir build --output-on-failure -R MCTests + ctest --test-dir build --output-on-failure -R "^MCTests" - name: cstest details if: startsWith(matrix.config.build-system, 'cmake') run: | - ctest --test-dir build --output-on-failure -R DetailTests + ctest --test-dir build --output-on-failure -R "^DetailTests" - name: cstest issues if: startsWith(matrix.config.build-system, 'cmake') run: | - ctest --test-dir build --output-on-failure -R IssueTests + ctest --test-dir build --output-on-failure -R "^IssueTests" - name: cstest features if: startsWith(matrix.config.build-system, 'cmake') run: | - ctest --test-dir build --output-on-failure -R FeaturesTests + ctest --test-dir build --output-on-failure -R "^FeaturesTests" - name: Legacy integration tests if: startsWith(matrix.config.build-system, 'cmake') @@ -216,12 +221,7 @@ jobs: - name: Valgrind cstest if: startsWith(matrix.config.build-system, 'cmake') && startsWith(matrix.config.enable-asan, 'OFF') && startsWith(matrix.config.enable-msan, 'OFF') run: | - sudo apt-get -y update - sudo apt-get -y install valgrind - valgrind --leak-check=full cstest tests/details - valgrind --leak-check=full cstest tests/features - valgrind --leak-check=full cstest tests/issues - valgrind --leak-check=full cstest tests/MC + ctest --test-dir build --output-on-failure -R valgrind_* - name: Compatibility header generation # clang-format-20 is only available in Ubuntu 24.04 diff --git a/.github/workflows/CrossBuilds.yml b/.github/workflows/CrossBuilds.yml index c4dcaf1b7..892905cd1 100644 --- a/.github/workflows/CrossBuilds.yml +++ b/.github/workflows/CrossBuilds.yml @@ -169,32 +169,32 @@ jobs: - name: unit tests if: ${{ matrix.config.skip_tests != true }} run: | - ctest --test-dir build --output-on-failure -R unit_* + ctest --test-dir build --output-on-failure -R "^unit_*" - name: "Integration tests" if: ${{ matrix.config.skip_tests != true }} run: | - ctest --test-dir build --output-on-failure -R integration_c_* + ctest --test-dir build --output-on-failure -R "^integration_c_*" - name: cstest MC if: ${{ matrix.config.skip_tests != true }} run: | - ctest --test-dir build --output-on-failure -R MCTests + ctest --test-dir build --output-on-failure -R "^MCTests" - name: cstest details if: ${{ matrix.config.skip_tests != true }} run: | - ctest --test-dir build --output-on-failure -R DetailTests + ctest --test-dir build --output-on-failure -R "^DetailTests" - name: cstest issues if: ${{ matrix.config.skip_tests != true }} run: | - ctest --test-dir build --output-on-failure -R IssueTests + ctest --test-dir build --output-on-failure -R "^IssueTests" - name: cstest features if: ${{ matrix.config.skip_tests != true }} run: | - ctest --test-dir build --output-on-failure -R FeaturesTests + ctest --test-dir build --output-on-failure -R "^FeaturesTests" - name: Legacy integration tests if: ${{ matrix.config.skip_tests != true }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 67ae4f145..5e5a7d3c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1098,6 +1098,7 @@ if(CAPSTONE_BUILD_CSTOOL) endif() endif() +find_program(VALGRIND_BIN NAMES valgrind) if(CAPSTONE_BUILD_CSTEST) enable_testing() set(CSTEST_DIR ${PROJECT_SOURCE_DIR}/suite/cstest) diff --git a/suite/cstest/CMakeLists.txt b/suite/cstest/CMakeLists.txt index 90cf71d04..cb1d24e59 100644 --- a/suite/cstest/CMakeLists.txt +++ b/suite/cstest/CMakeLists.txt @@ -161,6 +161,25 @@ add_test(NAME FeaturesTests COMMAND cstest ${PROJECT_SOURCE_DIR}/tests/features WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} ) +if (VALGRIND_BIN) +add_test(NAME valgrind_MCTests + COMMAND ${VALGRIND_BIN} --leak-check=full --error-exitcode=1 cstest ${PROJECT_SOURCE_DIR}/tests/MC + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +) +add_test(NAME valgrind_DetailTests + COMMAND ${VALGRIND_BIN} --leak-check=full --error-exitcode=1 cstest ${PROJECT_SOURCE_DIR}/tests/details + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +) +add_test(NAME valgrind_IssueTests + COMMAND ${VALGRIND_BIN} --leak-check=full --error-exitcode=1 cstest ${PROJECT_SOURCE_DIR}/tests/issues + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +) +add_test(NAME valgrind_FeaturesTests + COMMAND ${VALGRIND_BIN} --leak-check=full --error-exitcode=1 cstest ${PROJECT_SOURCE_DIR}/tests/features + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} +) +endif() + # These tests must be run independently. Otherwise we won't detect when one succeeds. # Because cstest will always return not 0 from the first failing test onwards. diff --git a/suite/cstest/test/CMakeLists.txt b/suite/cstest/test/CMakeLists.txt index 317f7d85e..0ad7dfa77 100644 --- a/suite/cstest/test/CMakeLists.txt +++ b/suite/cstest/test/CMakeLists.txt @@ -17,6 +17,14 @@ add_test(NAME unit_cstest COMMAND unit_test WORKING_DIRECTORY ${CSTEST_TEST_DIR} ) + +if (VALGRIND_BIN) + add_test(NAME valgrind_unit_cstest + COMMAND ${VALGRIND_BIN} --leak-check=full --error-exitcode=1 $ + WORKING_DIRECTORY ${CSTEST_TEST_DIR} + ) +endif() + add_test(NAME integration_py_cstest COMMAND python3 ${CSTEST_TEST_DIR}/integration_tests.py $ WORKING_DIRECTORY ${CSTEST_TEST_DIR} diff --git a/tests/integration/CMakeLists.txt b/tests/integration/CMakeLists.txt index ed4eebb71..87791d80c 100644 --- a/tests/integration/CMakeLists.txt +++ b/tests/integration/CMakeLists.txt @@ -42,5 +42,8 @@ foreach(TSRC ${INTEGRATION_TEST_SRC}) string(REGEX REPLACE ".c$" "" TBIN ${TSRC}) add_executable(${TBIN} "${TESTS_INTEGRATION_DIR}/${TSRC}") target_link_libraries(${TBIN} PRIVATE capstone) - add_test(NAME "integration_${TBIN}" COMMAND ${TBIN}) + add_test(NAME "integration_${TBIN}" COMMAND $) + if(VALGRIND_BIN) + add_test(NAME "valgrind_integration_${TBIN}" COMMAND ${VALGRIND_BIN} --leak-check=full --error-exitcode=1 $) + endif() endforeach()