name: Run Test on: push: paths-ignore: - ".gitignore" - "docs/**" - "ChangeLog" - "CREDITS.TXT" - "COMPILE_MAKE.TXT" - "BUILDING.md" - "CONTRIBUTING.md" - "LICENSE.TXT" - "LICENSE_LLVM.TXT" - "README.md" - "RELEASE_NOTES" - "SPONSORS.TXT" - "TODO" pull_request: # Stop previous runs on the same branch on new push concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: CI: true UBSAN_OPTIONS: "halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1" ASAN_OPTIONS: "halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1" LSAN_OPTIONS: "halt_on_error=1:abort_on_error=1:print_summary=1:print_stacktrace=1" jobs: Linux: runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.name }} strategy: fail-fast: false matrix: config: - { name: 'ubuntu-22.04 x64 make', os: ubuntu-22.04, arch: x64, build-system: 'make', diet-build: 'OFF', enable-asan: 'OFF' } - { name: 'ubuntu-22.04 x64 cmake', os: ubuntu-22.04, arch: x64, build-system: 'cmake', diet-build: 'OFF', enable-asan: 'OFF', build_type: 'Debug' } - { name: 'ubuntu-22.04 x64 debug - assert warn', os: ubuntu-22.04, arch: x64, build-system: 'cmake', diet-build: 'OFF', enable-asan: 'OFF', build_type: 'Debug', build_options: '-DCAPSTONE_ASSERTION_WARNINGS=ON' } - { name: 'ubuntu-22.04 x64 release - no assert warnings', os: ubuntu-22.04, arch: x64, build-system: 'cmake', diet-build: 'OFF', enable-asan: 'OFF', build_type: 'Release', build_options: '-DCAPSTONE_ASSERTION_WARNINGS=OFF' } - { name: 'ubuntu-22.04 x64 release - assert warn', os: ubuntu-22.04, arch: x64, build-system: 'cmake', diet-build: 'OFF', enable-asan: 'OFF', build_type: 'Release', build_options: '-DCAPSTONE_ASSERTION_WARNINGS=ON' } - { name: 'ubuntu-24.04 x64 ASAN', os: ubuntu-24.04, arch: x64, build-system: 'cmake', diet-build: 'OFF', enable-asan: 'ON', build_type: 'Debug' } steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: ${{ matrix.config.python-version }} - name: Prepare fuzzing run: | export LD_LIBRARY_PATH=`pwd`/tests/:$LD_LIBRARY_PATH 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: make if: startsWith(matrix.config.build-system, 'make') run: | ./make.sh sudo make install - name: cmake if: startsWith(matrix.config.build-system, 'cmake') env: asan: ${{ matrix.config.enable-asan }} build_option: ${{ matrix.config.build_option }} build_type: ${{ matrix.config.build_type }} run: | mkdir build && cd build # build static library cmake -DCMAKE_BUILD_TYPE=${build_type} -DCAPSTONE_INSTALL=1 -DCMAKE_INSTALL_PREFIX=/usr -DENABLE_ASAN=${asan} -DCAPSTONE_BUILD_DIET=${diet_build} ${build_option} .. cmake --build . --config ${build_type} # build shared library cmake -DCMAKE_BUILD_TYPE=${build_type} -DCAPSTONE_INSTALL=1 -DCAPSTONE_BUILD_SHARED_LIBS=1 -DCMAKE_INSTALL_PREFIX=/usr -DCAPSTONE_BUILD_CSTEST=ON -DENABLE_ASAN=${asan} ${build_option} .. sudo cmake --build . --config ${build_type} --target install - name: Lower number of KASL randomized address bits run: | # Work-around ASAN bug https://github.com/google/sanitizers/issues/1716 sudo sysctl vm.mmap_rnd_bits=28 - name: unit tests if: startsWith(matrix.config.build-system, 'cmake') run: | 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_* - name: cstool - reaches disassembler engine run: | sh suite/run_invalid_cstool.sh - name: cstest negatives if: startsWith(matrix.config.build-system, 'cmake') run: | ctest --test-dir build --output-on-failure -R NegativeTests1 ctest --test-dir build --output-on-failure -R NegativeTests2 ctest --test-dir build --output-on-failure -R NegativeTests3 ctest --test-dir build --output-on-failure -R NegativeTests4 ctest --test-dir build --output-on-failure -R NegativeTests5 ctest --test-dir build --output-on-failure -R NegativeTests6 - name: cstest MC if: startsWith(matrix.config.build-system, 'cmake') run: | 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 - name: cstest issues if: startsWith(matrix.config.build-system, 'cmake') run: | 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 - name: Legacy integration tests if: startsWith(matrix.config.build-system, 'cmake') run: | ctest --test-dir build --output-on-failure -R legacy* - name: Valgrind cstest if: startsWith(matrix.config.build-system, 'cmake') && startsWith(matrix.config.enable-asan, '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 - name: Compatibility header generation # clang-format-20 is only available in Ubuntu 24.04 # Hence the check only happens for it. if: startsWith(matrix.config.build-system, 'cmake') && startsWith(matrix.config.os, 'ubuntu-24.04') run: | sudo apt-get -y update sudo apt-get -y install clang-format-20 clang-format-20 --version cp ./include/capstone/arm64.h arm64_compat_current.h cp ./include/capstone/systemz_compatibility.h systemz_compat_current.h ./suite/auto-sync/src/autosync/HeaderPatcher.py -C ./.clang-format -c --v6 ./include/capstone/aarch64.h --v5 ./include/capstone/arm64.h ./suite/auto-sync/src/autosync/HeaderPatcher.py -C ./.clang-format -c --v6 ./include/capstone/systemz.h --v5 ./include/capstone/systemz_compatibility.h diff ./include/capstone/arm64.h arm64_compat_current.h && diff ./include/capstone/systemz_compatibility.h systemz_compat_current.h Windows: runs-on: ${{ matrix.config.os }} name: ${{ matrix.config.name }} strategy: fail-fast: false matrix: config: - name: 'windows x64 MSVC 64bit' os: windows-latest arch: x64 platform: windows python-arch: x64 python-version: '3.9' diet_build: false - name: 'windows x64 MSVC 64bit DIET' os: windows-latest arch: x64 platform: windows python-arch: x64 python-version: '3.9' diet_build: true steps: - uses: actions/checkout@v4 - uses: lukka/get-cmake@latest name: Get CMake - name: '🛠️ Win MSVC 64 setup' if: contains(matrix.config.name, 'MSVC 64') uses: ilammy/msvc-dev-cmd@v1 with: arch: 'x64' - name: '🚧 Win MSVC 64 build' if: contains(matrix.config.name, 'MSVC 64') shell: bash run: | cmake --version cmake --preset=${{ matrix.config.platform }}-x64${{ matrix.config.diet_build == true && '-diet' || '' }} cmake --build --preset build-${{ matrix.config.platform }}${{ matrix.config.diet_build == true && '-diet' || '' }}-release cmake --build --preset install-${{ matrix.config.platform }}${{ matrix.config.diet_build == true && '-diet' || '' }}-release