Skip to content

Add MemorySanitizer CI build #182

Add MemorySanitizer CI build

Add MemorySanitizer CI build #182

Workflow file for this run

name: Build and Test
on:
push:
branches:
- master
pull_request:
branches:
- master
schedule:
- cron: '0 6 * * 1' # Monday 6am UTC - weekly build to catch dependency issues
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
# MemorySanitizer build to detect uninitialized memory reads
msan:
timeout-minutes: 30
runs-on: ubuntu-24.04
env:
CC: clang
CXX: clang++
MSAN_FLAGS: "-fsanitize=memory -fsanitize-memory-track-origins -fno-omit-frame-pointer"
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y clang llvm cmake ninja-build
- name: Configure with MSan
run: |
cmake -G Ninja -S . -B build \
-DCMAKE_C_FLAGS="${MSAN_FLAGS}" \
-DCMAKE_CXX_FLAGS="${MSAN_FLAGS}" \
-DCMAKE_EXE_LINKER_FLAGS="${MSAN_FLAGS}" \
-DCMAKE_SHARED_LINKER_FLAGS="${MSAN_FLAGS}" \
-DCMAKE_BUILD_TYPE=Debug \
-DBUILD_TESTING=ON
- name: Build
run: ninja -C build
- name: Test
run: ctest --test-dir build --output-on-failure
linux:
# The jobs should run pretty quick; anything over 30m essentially means
# someting is stuck somewhere
timeout-minutes: 30
runs-on: ubuntu-latest
container: ${{ matrix.container }}
env:
GH_YML_JOBNAME: ${{ matrix.os }}-${{ matrix.compiler }}
GH_YML_BUILDTYPE: ${{ matrix.buildtype }}
GH_YML_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
strategy:
fail-fast: false
matrix:
buildtype: [ release, debug ]
os: [ alma9, ubuntu2204, ubuntu2404 ]
compiler: [ clang, gcc ]
include:
- os: alma9
container: almalinux:9
- os: ubuntu2404
container: ubuntu:24.04
- os: ubuntu2204
container: ubuntu:22.04
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: Setup
run: source/scripts/ci/setup/linux.sh
- name: Cache CMake build
uses: actions/cache@v4
with:
path: build
key: ${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.buildtype }}-${{ hashFiles('source/CMakeLists.txt', 'source/**/*.cmake') }}
restore-keys: |
${{ matrix.os }}-${{ matrix.compiler }}-${{ matrix.buildtype }}-
- name: Update
run: source/scripts/ci/gh-actions/run.sh update
- name: Configure
run: source/scripts/ci/gh-actions/run.sh configure
- name: Build
run: source/scripts/ci/gh-actions/run.sh build
- name: Test
run: source/scripts/ci/gh-actions/run.sh test
mac_and_windows:
# The jobs should run pretty quick; anything over 30m essentially means
# someting is stuck somewhere
timeout-minutes: 30
runs-on: ${{ matrix.vm }}
env:
GH_YML_JOBNAME: ${{ matrix.jobname }}
GH_YML_BUILDTYPE: ${{ matrix.buildtype }}
GH_YML_SHA: ${{ github.event.pull_request.head.sha || github.sha }}
strategy:
fail-fast: false
matrix:
buildtype: [ release, debug ]
jobname: [
windows2025-vs2022-clang,
windows2022-vs2022-msvc,
windows2022-vs2022-msvc-win32,
macos-clang ]
include:
- jobname: windows2025-vs2022-clang
vm: windows-2025
- jobname: windows2022-vs2022-msvc
vm: windows-2022
- jobname: windows2022-vs2022-msvc-win32
vm: windows-2022
- jobname: macos-clang
vm: macos-latest
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.pull_request.head.sha }}
path: source
- name: Setup Windows
if: ${{ runner.os == 'Windows' }}
run: source/scripts/ci/setup/windows.sh
- name: Setup macOS
if: ${{ runner.os == 'macOS' }}
run: source/scripts/ci/setup/macos.sh
- name: Cache CMake build
uses: actions/cache@v4
with:
path: build
key: ${{ matrix.jobname }}-${{ matrix.buildtype }}-${{ hashFiles('source/CMakeLists.txt', 'source/**/*.cmake') }}
restore-keys: |
${{ matrix.jobname }}-${{ matrix.buildtype }}-
- name: Update
run: source/scripts/ci/gh-actions/run.sh update
- name: Configure
run: source/scripts/ci/gh-actions/run.sh configure
- name: Build
run: source/scripts/ci/gh-actions/run.sh build
- name: Test
run: source/scripts/ci/gh-actions/run.sh test