diff options
author | Alex Crichton <alex@alexcrichton.com> | 2018-10-01 22:54:20 -0700 |
---|---|---|
committer | Alex Crichton <alex@alexcrichton.com> | 2018-10-01 22:55:59 -0700 |
commit | 74c1e44746a7d9c810f095177af88b7dbaafd3e3 (patch) | |
tree | c132fa6494b98a8374eaca66722eb8267999a9f5 /src/test/test_rust.sh | |
parent | 6ebb2c46d5eae7bae8d827fdc68d3ed58b16e95a (diff) | |
download | tor-74c1e44746a7d9c810f095177af88b7dbaafd3e3.tar.gz tor-74c1e44746a7d9c810f095177af88b7dbaafd3e3.zip |
Fix segfaults related to sanitizers+jemalloc
It looks to be the case that Rust's standard allocator, jemalloc, is
incompatible with sanitizers. The incompatibility, for whatever reason,
seems to cause segfaults at runtime when jemalloc is linked with
sanitizers.
Without actually trying to figure out what's going on here this commit
instead takes the hammer of "let's remove jemalloc when testing". The
`tor_allocate` crate now by default switches to the system allocator
(eventually this will want to be the tor allocator). Most crates then
link to `tor_allocate` ot pick this up, but the `smartlist` crate had to
manually switch to the system allocator in testing and the `external`
crate had to be sure to link to `tor_allocate`.
The final gotcha here is that this patch also switches to
unconditionally passing `--target` to Cargo. For weird and arcane
reasons passing `--target` with the host target of the compiler (which
Cargo otherwise uses as the default) is different than not passing
`--target` at all. This ensure that our custom `RUSTFLAGS` with
sanitizer options doesn't make its way into build scripts, just the
final testing artifacts.
Diffstat (limited to 'src/test/test_rust.sh')
-rwxr-xr-x | src/test/test_rust.sh | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/test/test_rust.sh b/src/test/test_rust.sh index a1a56af480..00b3e88d37 100755 --- a/src/test/test_rust.sh +++ b/src/test/test_rust.sh @@ -5,12 +5,20 @@ set -e export LSAN_OPTIONS=suppressions=${abs_top_srcdir:-../../..}/src/test/rust_supp.txt +# When testing Cargo we pass a number of very specific linker flags down +# through Cargo. We do not, however, want these flags to affect things like +# build scripts, only the tests that we're compiling. To ensure this happens +# we unconditionally pass `--target` into Cargo, ensuring that `RUSTFLAGS` in +# the environment won't make their way into build scripts. +rustc_host=$(rustc -vV | grep host | sed 's/host: //') + for cargo_toml_dir in "${abs_top_srcdir:-../../..}"/src/rust/*; do if [ -e "${cargo_toml_dir}/Cargo.toml" ]; then cd "${abs_top_builddir:-../../..}/src/rust" && \ CARGO_TARGET_DIR="${abs_top_builddir:-../../..}/src/rust/target" \ "${CARGO:-cargo}" test ${CARGO_ONLINE-"--frozen"} \ - --features "test_linking_hack" \ + --features "test_linking_hack" \ + --target $rustc_host \ ${EXTRA_CARGO_OPTIONS} \ --manifest-path "${cargo_toml_dir}/Cargo.toml" || exitcode=1 fi |