Skip to content

Commit

Permalink
Run sanitizers on CI
Browse files Browse the repository at this point in the history
  • Loading branch information
taiki-e committed Jan 5, 2021
1 parent de4f099 commit 784d002
Show file tree
Hide file tree
Showing 8 changed files with 73 additions and 23 deletions.
16 changes: 14 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ on:
- cron: '0 1 * * *'

env:
RUSTFLAGS: -Dwarnings
RUSTFLAGS: -D warnings
RUST_BACKTRACE: 1

defaults:
Expand Down Expand Up @@ -114,12 +114,23 @@ jobs:
- name: clippy
run: ./ci/clippy.sh

# Run sanitizers.
san:
name: san
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install Rust
run: rustup update nightly && rustup default nightly
- name: Run sanitizers
run: ./ci/san.sh

# Run loom tests.
loom:
name: loom
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- uses: actions/checkout@v2
- name: Install Rust
run: rustup update stable && rustup default stable
- name: loom
Expand Down Expand Up @@ -151,6 +162,7 @@ jobs:
- dependencies
- rustfmt
- clippy
- san
- loom
- docs
runs-on: ubuntu-latest
Expand Down
2 changes: 1 addition & 1 deletion ci/dependencies.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ cargo tree --duplicate
cargo tree --duplicate || exit 1

# Check minimal versions.
cargo update -Zminimal-versions
cargo update -Z minimal-versions
cargo tree
cargo check --all --all-features --exclude benchmarks

Expand Down
39 changes: 39 additions & 0 deletions ci/san.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash

cd "$(dirname "$0")"/..
set -ex

if [[ "$OSTYPE" != "linux"* ]]; then
exit 0
fi

rustup component add rust-src

# Run address sanitizer
cargo clean
# https://github.com/crossbeam-rs/crossbeam/issues/614
export ASAN_OPTIONS="detect_leaks=0"
# TODO: Once `cfg(sanitize = "..")` is stable, replace
# `cfg(crossbeam_sanitize)` with `cfg(sanitize = "..")` and remove
# `--cfg crossbeam_sanitize`.
RUSTFLAGS="-D warnings -Z sanitizer=address --cfg crossbeam_sanitize" \
cargo test --all --release --target x86_64-unknown-linux-gnu --tests --exclude benchmarks -- --test-threads=1

RUSTFLAGS="-D warnings -Z sanitizer=address --cfg crossbeam_sanitize" \
cargo run \
--release \
--target x86_64-unknown-linux-gnu \
--features nightly \
--example sanitize \
--manifest-path crossbeam-epoch/Cargo.toml

# Run memory sanitizer
cargo clean
RUSTFLAGS="-D warnings -Z sanitizer=memory --cfg crossbeam_sanitize" \
cargo test -Z build-std --all --release --target x86_64-unknown-linux-gnu --tests --exclude benchmarks -- --test-threads=1

# Run thread sanitizer
cargo clean
export TSAN_OPTIONS="suppressions=$(pwd)/ci/tsan"
RUSTFLAGS="-D warnings -Z sanitizer=thread --cfg crossbeam_sanitize" \
cargo test -Z build-std --all --release --target x86_64-unknown-linux-gnu --tests --exclude benchmarks -- --test-threads=1
20 changes: 1 addition & 19 deletions ci/test.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export RUSTFLAGS="-D warnings"
if [[ -n "$TARGET" ]]; then
# If TARGET is specified, use cross for testing.
cargo install cross
cross test --all --target "$TARGET" --exclude benchmarks
cross test --all --target "$TARGET" --exclude benchmarks -- --test-threads=1

# For now, the non-host target only runs tests.
exit 0
Expand All @@ -25,22 +25,4 @@ if [[ "$RUST_VERSION" == "nightly"* ]]; then
# Benchmarks are only checked on nightly because depending on unstable features.
cargo check --all --benches
cargo check --bins --manifest-path crossbeam-channel/benchmarks/Cargo.toml

# Run address sanitizer on crossbeam-epoch
# Note: this will be significantly rewritten by https://github.com/crossbeam-rs/crossbeam/pull/591.
if [[ "$OSTYPE" == "linux"* ]]; then
cargo clean

# TODO: Once `cfg(sanitize = "..")` is stable, replace
# `cfg(crossbeam_sanitize)` with `cfg(sanitize = "..")` and remove
# `--cfg crossbeam_sanitize`.
ASAN_OPTIONS="detect_odr_violation=0 detect_leaks=0" \
RUSTFLAGS="-Z sanitizer=address --cfg crossbeam_sanitize" \
cargo run \
--release \
--target x86_64-unknown-linux-gnu \
--features nightly \
--example sanitize \
--manifest-path crossbeam-epoch/Cargo.toml
fi
fi
13 changes: 13 additions & 0 deletions ci/tsan
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# TSAN suppressions file for crossbeam

# The epoch-based GC uses fences.
race:crossbeam_epoch

# Push and steal operations in crossbeam-deque may cause data races, but such
# data races are safe. If a data race happens, the value read by `steal` is
# forgotten and the steal operation is then retried.
race:crossbeam_deque*push
race:crossbeam_deque*steal

# AtomicCell::compare_exchange uses fences if it is not lock-free.
race:crossbeam_utils::atomic::atomic_cell::AtomicCell<T>::compare_exchange
2 changes: 2 additions & 0 deletions crossbeam-channel/tests/tick.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ fn recv() {
assert_eq!(r.try_recv(), Err(TryRecvError::Empty));
}

#[cfg(not(crossbeam_sanitize))] // TODO: assertions failed due to tsan is slow
#[test]
fn recv_timeout() {
let start = Instant::now();
Expand Down Expand Up @@ -251,6 +252,7 @@ fn select() {
assert_eq!(hits.load(Ordering::SeqCst), 8);
}

#[cfg(not(crossbeam_sanitize))] // TODO: assertions failed due to tsan is slow
#[test]
fn ready() {
const THREADS: usize = 4;
Expand Down
3 changes: 2 additions & 1 deletion crossbeam-epoch/src/collector.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
/// ```
use core::fmt;

use crate::primitive::sync::Arc;
use crate::guard::Guard;
use crate::internal::{Global, Local};
use crate::primitive::sync::Arc;

/// An epoch-based garbage collector.
pub struct Collector {
Expand Down Expand Up @@ -199,6 +199,7 @@ mod tests {
.unwrap();
}

#[cfg(not(crossbeam_sanitize))] // TODO: assertions failed due to tsan is slow
#[test]
fn incremental() {
const COUNT: usize = 100_000;
Expand Down
1 change: 1 addition & 0 deletions crossbeam-epoch/src/internal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -375,6 +375,7 @@ pub(crate) struct Local {

// Make sure `Local` is less than or equal to 2048 bytes.
// https://github.com/crossbeam-rs/crossbeam/issues/551
#[cfg(not(crossbeam_sanitize))] // `crossbeam_sanitize` reduces the size of `Local`
#[test]
fn local_size() {
assert!(
Expand Down

0 comments on commit 784d002

Please sign in to comment.