From 61324936ac07c9d1a43ea412f58c371007b63042 Mon Sep 17 00:00:00 2001 From: Max Inden Date: Wed, 2 Oct 2024 08:55:23 +0200 Subject: [PATCH] ci: run tests with sanitizers on Linux and MacOS --- .github/workflows/check.yml | 20 +++++++++++++++++++- neqo-common/build.rs | 11 +++++++++++ neqo-common/src/hrtime.rs | 3 +++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 490c7047c4..b9e1c237fa 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -45,7 +45,7 @@ jobs: - uses: ./.github/actions/rust with: version: ${{ matrix.rust-toolchain }} - components: ${{ matrix.rust-toolchain == 'stable' && 'llvm-tools-preview' || '' }} + components: ${{ matrix.rust-toolchain == 'stable' && 'llvm-tools-preview,' || '' }} ${{ matrix.rust-toolchain == 'nightly' && 'rust-src,' || '' }} tools: ${{ matrix.rust-toolchain == 'stable' && 'cargo-llvm-cov, ' || '' }} cargo-nextest token: ${{ secrets.GITHUB_TOKEN }} @@ -97,6 +97,24 @@ jobs: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} if: matrix.type == 'debug' && matrix.rust-toolchain == 'stable' + - name: Run tests with sanitizers + if: (matrix.os == 'ubuntu-latest' || matrix.os == 'macos-latest') && matrix.rust-toolchain == 'nightly' + env: + RUST_LOG: trace + run: | + if [ "${{ matrix.os }}" = "ubuntu-latest" ]; then + TARGET="x86_64-unknown-linux-gnu" + SANITIZERS="address thread leak" + elif [ "${{ matrix.os }}" = "macos-latest" ]; then + TARGET="aarch64-apple-darwin" + # no leak sanitizer support yet + SANITIZERS="address thread" + fi + for sanitizer in $SANITIZERS; do + echo "Running tests with $sanitizer sanitizer..." + RUSTFLAGS="-Z sanitizer=$sanitizer" RUSTDOCFLAGS="-Z sanitizer=$sanitizer" cargo +nightly nextest run -Z build-std --target "$TARGET" + done + bench: needs: [check] uses: ./.github/workflows/bench.yml diff --git a/neqo-common/build.rs b/neqo-common/build.rs index 9047b1f5d0..5a4ee62139 100644 --- a/neqo-common/build.rs +++ b/neqo-common/build.rs @@ -11,4 +11,15 @@ fn main() { if target.contains("windows") { println!("cargo:rustc-link-lib=winmm"); } + + // `cfg(sanitize = "..")` is not stabilized. + // + // See . + println!("cargo:rustc-check-cfg=cfg(neqo_sanitize_address)"); + if env::var("CARGO_CFG_SANITIZE") + .unwrap_or_default() + .contains("address") + { + println!("cargo:rustc-cfg=neqo_sanitize_address"); + } } diff --git a/neqo-common/src/hrtime.rs b/neqo-common/src/hrtime.rs index 7d676620db..bb4fb226b9 100644 --- a/neqo-common/src/hrtime.rs +++ b/neqo-common/src/hrtime.rs @@ -419,6 +419,7 @@ mod test { /// Note that you have to run this test alone or other tests will /// grab the high resolution timer and this will run faster. + #[cfg(not(neqo_sanitize_address))] // Sanitizer is too slow to uphold timing assumptions. #[test] fn baseline() { check_delays(GENEROUS); @@ -430,6 +431,7 @@ mod test { check_delays(ONE_AND_A_BIT); } + #[cfg(not(neqo_sanitize_address))] // Sanitizer is too slow to uphold timing assumptions. #[test] fn multithread_baseline() { let thr = spawn(move || { @@ -448,6 +450,7 @@ mod test { thr.join().unwrap(); } + #[cfg(not(neqo_sanitize_address))] // Sanitizer is too slow to uphold timing assumptions. #[test] fn mixed_multi() { let thr = spawn(move || {