diff --git a/.mci.yml b/.mci.yml index c9b9341766..9d3321c286 100644 --- a/.mci.yml +++ b/.mci.yml @@ -28,20 +28,20 @@ variables: ## cdriver configure flags cdriver_configure_flags: - linux_cdriver_configure_flags: &linux_cdriver_configure_flags --enable-ssl --enable-sasl + linux_cdriver_configure_flags: &linux_cdriver_configure_flags --enable-ssl --enable-sasl --with-gnu-ld CFLAGS=-fno-omit-frame-pointer osx_cdriver_configure_flags: &osx_cdriver_configure_flags --enable-ssl --enable-sasl ## cmake flag variables cmake_flags: - ubuntu_cmake_flags: &ubuntu_cmake_flags -DCMAKE_CXX_FLAGS="-Wall -Wextra -Wno-attributes -Werror -Wno-error=missing-field-initializers" - osx_cmake_flags: &osx_cmake_flags -DCMAKE_CXX_FLAGS="-stdlib=libc++ -Wall -Wextra -Wno-attributes -Werror -Wno-error=missing-field-initializers" -DBSONCXX_POLY_USE_BOOST=ON - asan_cmake_flags: &asan_cmake_flags -DCMAKE_CXX_FLAGS="-fsanitize=address -O1 -fno-omit-frame-pointer -Wall -Wextra -Wno-attributes -Werror -Wno-error=missing-field-initializers -Wno-error=maybe-uninitialized" - ubsan_cmake_flags: &ubsan_cmake_flags -DCMAKE_CXX_COMPILER="/usr/bin/clang++" -DCMAKE_CXX_FLAGS="-fsanitize=undefined -g -fno-omit-frame-pointer -fsanitize-blacklist=$(pwd)/../etc/ubsan.blacklist -fno-sanitize-recover -Wall -Wextra -Wno-attributes -Werror -Wno-error=missing-field-initializers" + ubuntu_cmake_flags: &ubuntu_cmake_flags -DCMAKE_CXX_FLAGS="-Wall -Wextra -Werror -Wno-error=missing-field-initializers" + osx_cmake_flags: &osx_cmake_flags -DCMAKE_CXX_FLAGS="-stdlib=libc++ -Wall -Wextra -Werror" -DBSONCXX_POLY_USE_BOOST=ON + asan_cmake_flags: &asan_cmake_flags -DCMAKE_CXX_COMPILER="/usr/bin/clang++" -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0 -fsanitize=address -O1 -g -fno-omit-frame-pointer -Wall -Wextra -Werror" + ubsan_cmake_flags: &ubsan_cmake_flags -DCMAKE_CXX_COMPILER="/usr/bin/clang++" -DCMAKE_CXX_FLAGS="-D_GLIBCXX_USE_CXX11_ABI=0 -fsanitize=undefined -fsanitize-blacklist=$(pwd)/../etc/ubsan.blacklist -fno-sanitize-recover=undefined -O1 -g -fno-omit-frame-pointer -Wall -Wextra -Werror" ## test parameters test_params: - asan_test_params: &asan_test_params ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.5 ASAN_OPTIONS="detect_leaks=1" - ubsan_test_params: &ubsan_test_params UBSAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer UBSAN_OPTIONS="print_stacktrace=1" + asan_test_params: &asan_test_params PATH="/usr/lib/llvm-3.8/bin" ASAN_OPTIONS="detect_leaks=1" + ubsan_test_params: &ubsan_test_params PATH="usr/lib/llvm-3.8/bin" UBSAN_OPTIONS="print_stacktrace=1" valgrind_test_params: &valgrind_test_params valgrind --leak-check=full --track-origins=yes --num-callers=50 --error-exitcode=1 --error-limit=no --read-var-info=yes --suppressions=../etc/memcheck.suppressions @@ -79,7 +79,7 @@ functions: cd mongo-c-driver git checkout 1.3.4 rm -rf /data/tmp/c-driver-install - ./autogen.sh --prefix="/data/tmp/c-driver-install" --enable-tests=no --enable-examples=no --with-libbson=bundled --disable-extra-align ${cdriver_configure_flags} + ./autogen.sh --prefix="/data/tmp/c-driver-install" --enable-tests=no --enable-examples=no --with-libbson=bundled --disable-extra-align --enable-debug --enable-optimizations --disable-shm-counters --disable-static --disable-dependency-tracking --with-pic --disable-automatic-init-and-cleanup ${cdriver_configure_flags} make ${compile_concurrency} make install @@ -200,8 +200,8 @@ buildvariants: tasks: - name: compile_and_test - - name: ubuntu1410-debug-valgrind - display_name: "Valgrind Ubuntu 14.10 Debug" + - name: ubuntu1604-debug-valgrind + display_name: "Valgrind Ubuntu 16.04 Debug" expansions: build_type: "Debug" source: *ubuntu_source @@ -212,12 +212,12 @@ buildvariants: cmake_flags: *ubuntu_cmake_flags test_params: *valgrind_test_params run_on: - - ubuntu1410-build + - ubuntu1604-build tasks: - name: compile_and_test - - name: ubuntu1410-debug-asan - display_name: "ASAN Ubuntu 14.10 Debug" + - name: ubuntu1604-debug-asan + display_name: "ASAN Ubuntu 16.04 Debug" expansions: build_type: "Debug" source: *ubuntu_source @@ -228,12 +228,12 @@ buildvariants: cmake_flags: *asan_cmake_flags test_params: *asan_test_params run_on: - - ubuntu1410-build + - ubuntu1604-build tasks: - name: compile_and_test - - name: ubuntu1410-debug-ubsan - display_name: "UBSAN Ubuntu 14.10 Debug" + - name: ubuntu1604-debug-ubsan + display_name: "UBSAN Ubuntu 16.04 Debug" expansions: build_type: "Debug" source: *ubuntu_source @@ -244,6 +244,6 @@ buildvariants: cmake_flags: *ubsan_cmake_flags test_params: *ubsan_test_params run_on: - - ubuntu1410-build + - ubuntu1604-build tasks: - name: compile_and_test diff --git a/src/mongocxx/instance.cpp b/src/mongocxx/instance.cpp index 46f9d59c30..92fc36efd1 100644 --- a/src/mongocxx/instance.cpp +++ b/src/mongocxx/instance.cpp @@ -27,6 +27,10 @@ #include +#if !defined(__has_feature) +#define __has_feature(x) 0 +#endif + namespace mongocxx { MONGOCXX_INLINE_NAMESPACE_BEGIN @@ -96,7 +100,15 @@ class instance::impl { if (_user_logger) { libmongoc::log_set_handler(null_log_handler, nullptr); } + +// Under ASAN, we don't want to clean up libmongoc, because it causes libraries to become +// unloaded, and then ASAN sees non-rooted allocations that it consideres leaks. These are +// also inscrutable, because the stack refers into an unloaded library, which ASAN can't +// report. Note that this only works if we have built mongoc so that it doesn't do its +// unfortunate automatic invocation of 'cleanup'. +#if !__has_feature(address_sanitizer) libmongoc::cleanup(); +#endif } const std::unique_ptr _user_logger; diff --git a/src/mongocxx/test/pool.cpp b/src/mongocxx/test/pool.cpp index 424364ea2b..4a9e024b2d 100644 --- a/src/mongocxx/test/pool.cpp +++ b/src/mongocxx/test/pool.cpp @@ -83,7 +83,7 @@ TEST_CASE( ssl_opts.crl_file(crl_file); ssl_opts.allow_invalid_certificates(allow_invalid_certificates); - ::mongoc_ssl_opt_t interposed = {0}; + ::mongoc_ssl_opt_t interposed = {}; client_pool_set_ssl_opts->interpose( [&](::mongoc_client_pool_t*, const ::mongoc_ssl_opt_t* opts) {