diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c7b9883..234b2bf 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -32,8 +32,16 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest] + os: [ubuntu-22.04] gcc_v: [9, 10, 11, 12] + sanitizer: [none, asan, msan, tsan] + buildtype: [debug] + + include: + - os: ubuntu-22.04 + gcc_v: 12 + sanitizer: none + buildtype: release env: FC: gfortran @@ -59,6 +67,12 @@ jobs: ln -s /usr/local/bin/g++-${{ env.GCC_V }} /usr/local/bin/g++ - name: Install GCC (Linux) + run: | + sudo add-apt-repository ppa:ubuntu-toolchain-r/test + sudo apt-get update + sudo apt-get install gcc-${{ env.GCC_V }} g++-${{ env.GCC_V }} gfortran-${{ env.GCC_V }} + + - name: Set GCC Version (Linux) if: contains(matrix.os, 'ubuntu') run: >- sudo update-alternatives @@ -76,10 +90,11 @@ jobs: - name: Configure build run: >- meson setup ${{ env.M_BUILD_DIR }} - --buildtype=debug + --buildtype=${{ matrix.buildtype }} --prefix=$PWD/_dist --libdir=lib --warnlevel=0 + -Dsanitizer=${{ matrix.sanitizer }} -Db_coverage=${{ env.COVERAGE }} env: COVERAGE: ${{ contains(matrix.os, 'ubuntu') && 'true' || 'false' }} diff --git a/meson.build b/meson.build index caa3778..8b63715 100644 --- a/meson.build +++ b/meson.build @@ -23,11 +23,49 @@ project( meson_version: '>=0.51', default_options: [ 'default_library=both', + 'warning_level=3', ], ) cxx = meson.get_compiler('cpp') + +if get_option('buildtype') == 'debug' + add_project_arguments( + [ + '-Wzero-as-null-pointer-constant', + '-Wlogical-not-parentheses', + '-Db_sanitize=address,undefined' + ], + language: 'cpp' + ) + + add_project_arguments('-fno-omit-frame-pointer', language: 'cpp') + add_project_link_arguments('-fno-omit-frame-pointer', language: 'cpp') + + sanitizer = get_option('sanitizer') + if sanitizer == 'asan' + message('Enabling ASan + UBSan + LSan') + add_project_arguments('-Db_sanitize=address,undefined', language: 'cpp') + + message('Adding "-fsanitize-address-use-after-scope" argument (ignore the subsequent warnings).') + add_project_arguments('-fsanitize-address-use-after-scope', language: 'cpp') + add_project_link_arguments('-fsanitize-address-use-after-scope', '-fno-omit-frame-pointer', language: 'cpp') + + elif sanitizer == 'msan' + message('Enabling Memory Sanitizer (MSan)') + add_project_arguments('-Db_sanitize=memory', language: 'cpp') + + elif sanitizer == 'tsan' + message('Enabling Thread Sanitizer (TSan)') + add_project_arguments('-Db_sanitize=thread', language: 'cpp') + + else + message('No sanitizers enabled') + endif +endif + + deps = [] foreach lib: ['cblas', 'lapacke'] this_dep = dependency(lib, required: false) diff --git a/meson_options.txt b/meson_options.txt new file mode 100644 index 0000000..7ff1c55 --- /dev/null +++ b/meson_options.txt @@ -0,0 +1,8 @@ +option( + 'sanitizer', + type: 'combo', + choices: ['none', 'asan', 'msan', 'tsan'], + value: 'none', + description: + 'Choose a set of sanitizers to enable' +) \ No newline at end of file