aboutsummaryrefslogtreecommitdiff
path: root/.github/workflows/sanitizer.yml
blob: 86cccf4102c3e55f09fb26f8c4b9d43afc6e6a8b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
name: sanitizer

on:
  push: {}
  pull_request: {}

env:
  UBSAN_OPTIONS: "print_stacktrace=1"

jobs:
  job:
    name: ${{ matrix.sanitizer }}.${{ matrix.build_type }}
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        build_type: ['Debug', 'RelWithDebInfo']
        sanitizer: ['asan', 'ubsan', 'tsan', 'msan']

    steps:
    - uses: actions/checkout@v3

    - name: configure msan env
      if: matrix.sanitizer == 'msan'
      run: |
        echo "EXTRA_FLAGS=-g -O2 -fno-omit-frame-pointer -fsanitize=memory -fsanitize-memory-track-origins" >> $GITHUB_ENV
        echo "LIBCXX_SANITIZER=MemoryWithOrigins" >> $GITHUB_ENV

    - name: configure ubsan env
      if: matrix.sanitizer == 'ubsan'
      run: |
        echo "EXTRA_FLAGS=-g -O2 -fno-omit-frame-pointer -fsanitize=undefined -fno-sanitize-recover=all" >> $GITHUB_ENV
        echo "LIBCXX_SANITIZER=Undefined" >> $GITHUB_ENV

    - name: configure asan env
      if: matrix.sanitizer == 'asan'
      run: |
        echo "EXTRA_FLAGS=-g -O2 -fno-omit-frame-pointer -fsanitize=address -fno-sanitize-recover=all" >> $GITHUB_ENV
        echo "LIBCXX_SANITIZER=Address" >> $GITHUB_ENV

    - name: configure tsan env
      if: matrix.sanitizer == 'tsan'
      run: |
        echo "EXTRA_FLAGS=-g -O2 -fno-omit-frame-pointer -fsanitize=thread -fno-sanitize-recover=all" >> $GITHUB_ENV
        echo "LIBCXX_SANITIZER=Thread" >> $GITHUB_ENV

    - name: fine-tune asan options
      # in asan we get an error from std::regex. ignore it.
      if: matrix.sanitizer == 'asan'
      run: |
        echo "ASAN_OPTIONS=alloc_dealloc_mismatch=0" >> $GITHUB_ENV

    - name: setup clang
      uses: egor-tensin/setup-clang@v1
      with:
        version: latest
        platform: x64

    - name: configure clang
      run: |
        echo "CC=cc" >> $GITHUB_ENV
        echo "CXX=c++" >> $GITHUB_ENV

    - name: build libc++ (non-asan)
      if: matrix.sanitizer != 'asan'
      run: |
        "${GITHUB_WORKSPACE}/.github/libcxx-setup.sh"
        echo "EXTRA_CXX_FLAGS=-stdlib=libc++ -L ${GITHUB_WORKSPACE}/llvm-build/lib -lc++abi -Isystem${GITHUB_WORKSPACE}/llvm-build/include -Isystem${GITHUB_WORKSPACE}/llvm-build/include/c++/v1 -Wl,-rpath,${GITHUB_WORKSPACE}/llvm-build/lib" >> $GITHUB_ENV

    - name: create build environment
      run: cmake -E make_directory ${{ runner.workspace }}/_build

    - name: configure cmake
      shell: bash
      working-directory: ${{ runner.workspace }}/_build
      run: >
        VERBOSE=1
        cmake $GITHUB_WORKSPACE
        -DBENCHMARK_ENABLE_ASSEMBLY_TESTS=OFF
        -DBENCHMARK_ENABLE_LIBPFM=OFF
        -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
        -DCMAKE_C_COMPILER=${{ env.CC }}
        -DCMAKE_CXX_COMPILER=${{ env.CXX }}
        -DCMAKE_C_FLAGS="${{ env.EXTRA_FLAGS }}"
        -DCMAKE_CXX_FLAGS="${{ env.EXTRA_FLAGS }} ${{ env.EXTRA_CXX_FLAGS }}"
        -DCMAKE_BUILD_TYPE=${{ matrix.build_type }}

    - name: build
      shell: bash
      working-directory: ${{ runner.workspace }}/_build
      run: cmake --build . --config ${{ matrix.build_type }}

    - name: test
      shell: bash
      working-directory: ${{ runner.workspace }}/_build
      run: ctest -C ${{ matrix.build_type }} -VV