diff --git a/.evergreen/config_generator/components/sanitizers.py b/.evergreen/config_generator/components/sanitizers.py index 5afa5a7e6f..1f1057cbef 100644 --- a/.evergreen/config_generator/components/sanitizers.py +++ b/.evergreen/config_generator/components/sanitizers.py @@ -22,8 +22,7 @@ # pylint: disable=line-too-long # fmt: off MATRIX = [ - ('rhel80', ['asan', ], ['shared', 'static'], [False, True], ['4.0', '8.0', 'latest'], ['single', 'replica', 'sharded']), - ('rhel80', [ 'ubsan'], [ 'static'], [False ], ['4.0', '8.0', 'latest'], ['single', 'replica', 'sharded']), + ('rhel80', ['asan', 'ubsan'], ['shared', 'static'], [False, True], ['4.0', '8.0', 'latest'], ['single', 'replica', 'sharded']), ] # fmt: on # pylint: enable=line-too-long @@ -101,7 +100,7 @@ def tasks(): test_vars |= { 'TEST_WITH_UBSAN': 'ON', 'example_projects_cxxflags': '-fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer', - 'example_projects_ldflags': '-fsanitize=undefined -fno-sanitize-recover=undefined', + 'example_projects_ldflags': '-fsanitize=undefined -fno-sanitize-recover=undefined' + (' -static-libsan' if link_type == 'static' else ''), } commands += [ diff --git a/.evergreen/generated_configs/tasks.yml b/.evergreen/generated_configs/tasks.yml index 067b980a93..34c63de528 100644 --- a/.evergreen/generated_configs/tasks.yml +++ b/.evergreen/generated_configs/tasks.yml @@ -15947,9 +15947,728 @@ tasks: example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=address -fno-omit-frame-pointer example_projects_ldflags: -fsanitize=address + - name: sanitizers-ubsan-rhel80-clang-shared-4.0-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, "4.0", replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: "4.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-4.0-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, "4.0", sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: "4.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-4.0-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, "4.0", single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + mongodb_version: "4.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-8.0-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, "8.0", replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: "8.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-8.0-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, "8.0", sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: "8.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-8.0-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, "8.0", single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + mongodb_version: "8.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-4.0-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, "4.0", replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: "4.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-4.0-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, "4.0", sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: "4.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-4.0-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, "4.0", single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + mongodb_version: "4.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-8.0-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, "8.0", replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: "8.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-8.0-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, "8.0", sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: "8.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-8.0-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, "8.0", single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + mongodb_version: "8.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-latest-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, latest, replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: latest + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-latest-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, latest, sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: latest + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-extra_alignment-latest-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, extra_alignment, latest, single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + mongodb_version: latest + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-latest-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, latest, replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: latest + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-latest-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, latest, sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: latest + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + - name: sanitizers-ubsan-rhel80-clang-shared-latest-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, shared, latest, single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - func: setup + - func: start_mongod + vars: + mongodb_version: latest + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined - name: sanitizers-ubsan-rhel80-clang-static-4.0-replica run_on: rhel80-large - tags: [sanitizers, ubsan, rhel80, clang, static, "4.0", replica] + tags: [sanitizers, ubsan, rhel80, clang, static, "4.0", replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: "4.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-4.0-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, "4.0", sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: "4.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-4.0-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, "4.0", single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + mongodb_version: "4.0" + - func: install_c_driver + vars: + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + ENABLE_TESTS: "ON" + RUN_DISTCHECK: 1 + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-8.0-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, "8.0", replica] commands: - command: expansions.update params: @@ -15962,7 +16681,7 @@ tasks: - func: start_mongod vars: TOPOLOGY: replica_set - mongodb_version: "4.0" + mongodb_version: "8.0" - func: install_c_driver vars: SKIP_INSTALL_LIBMONGOCRYPT: 1 @@ -15981,10 +16700,10 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined - - name: sanitizers-ubsan-rhel80-clang-static-4.0-sharded + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-8.0-sharded run_on: rhel80-large - tags: [sanitizers, ubsan, rhel80, clang, static, "4.0", sharded] + tags: [sanitizers, ubsan, rhel80, clang, static, "8.0", sharded] commands: - command: expansions.update params: @@ -15997,7 +16716,7 @@ tasks: - func: start_mongod vars: TOPOLOGY: sharded_cluster - mongodb_version: "4.0" + mongodb_version: "8.0" - func: install_c_driver vars: SKIP_INSTALL_LIBMONGOCRYPT: 1 @@ -16016,10 +16735,10 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined - - name: sanitizers-ubsan-rhel80-clang-static-4.0-single + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-8.0-single run_on: rhel80-large - tags: [sanitizers, ubsan, rhel80, clang, static, "4.0", single] + tags: [sanitizers, ubsan, rhel80, clang, static, "8.0", single] commands: - command: expansions.update params: @@ -16031,7 +16750,7 @@ tasks: - func: setup - func: start_mongod vars: - mongodb_version: "4.0" + mongodb_version: "8.0" - func: install_c_driver vars: SKIP_INSTALL_LIBMONGOCRYPT: 1 @@ -16050,10 +16769,117 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined - - name: sanitizers-ubsan-rhel80-clang-static-8.0-replica + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-4.0-replica run_on: rhel80-large - tags: [sanitizers, ubsan, rhel80, clang, static, "8.0", replica] + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, "4.0", replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: "4.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-4.0-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, "4.0", sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: "4.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-4.0-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, "4.0", single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + mongodb_version: "4.0" + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-8.0-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, "8.0", replica] commands: - command: expansions.update params: @@ -16069,12 +16895,13 @@ tasks: mongodb_version: "8.0" - func: install_c_driver vars: + BSON_EXTRA_ALIGNMENT: 1 SKIP_INSTALL_LIBMONGOCRYPT: 1 - func: install-uv - func: compile vars: + BSON_EXTRA_ALIGNMENT: 1 ENABLE_TESTS: "ON" - RUN_DISTCHECK: 1 USE_SANITIZER_UBSAN: "ON" - func: fetch-det - func: run_kms_servers @@ -16085,10 +16912,10 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined - - name: sanitizers-ubsan-rhel80-clang-static-8.0-sharded + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-8.0-sharded run_on: rhel80-large - tags: [sanitizers, ubsan, rhel80, clang, static, "8.0", sharded] + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, "8.0", sharded] commands: - command: expansions.update params: @@ -16104,12 +16931,13 @@ tasks: mongodb_version: "8.0" - func: install_c_driver vars: + BSON_EXTRA_ALIGNMENT: 1 SKIP_INSTALL_LIBMONGOCRYPT: 1 - func: install-uv - func: compile vars: + BSON_EXTRA_ALIGNMENT: 1 ENABLE_TESTS: "ON" - RUN_DISTCHECK: 1 USE_SANITIZER_UBSAN: "ON" - func: fetch-det - func: run_kms_servers @@ -16120,10 +16948,10 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined - - name: sanitizers-ubsan-rhel80-clang-static-8.0-single + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-8.0-single run_on: rhel80-large - tags: [sanitizers, ubsan, rhel80, clang, static, "8.0", single] + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, "8.0", single] commands: - command: expansions.update params: @@ -16138,12 +16966,13 @@ tasks: mongodb_version: "8.0" - func: install_c_driver vars: + BSON_EXTRA_ALIGNMENT: 1 SKIP_INSTALL_LIBMONGOCRYPT: 1 - func: install-uv - func: compile vars: + BSON_EXTRA_ALIGNMENT: 1 ENABLE_TESTS: "ON" - RUN_DISTCHECK: 1 USE_SANITIZER_UBSAN: "ON" - func: fetch-det - func: run_kms_servers @@ -16154,7 +16983,114 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-latest-replica + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, latest, replica] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: replica_set + mongodb_version: latest + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: replica + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-latest-sharded + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, latest, sharded] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + TOPOLOGY: sharded_cluster + mongodb_version: latest + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: sharded + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan + - name: sanitizers-ubsan-rhel80-clang-static-extra_alignment-latest-single + run_on: rhel80-large + tags: [sanitizers, ubsan, rhel80, clang, static, extra_alignment, latest, single] + commands: + - command: expansions.update + params: + updates: + - { key: build_type, value: Debug } + - { key: cc_compiler, value: /opt/mongodbtoolchain/v4/bin/clang } + - { key: cxx_compiler, value: /opt/mongodbtoolchain/v4/bin/clang++ } + - { key: USE_STATIC_LIBS, value: "1" } + - func: setup + - func: start_mongod + vars: + mongodb_version: latest + - func: install_c_driver + vars: + BSON_EXTRA_ALIGNMENT: 1 + SKIP_INSTALL_LIBMONGOCRYPT: 1 + - func: install-uv + - func: compile + vars: + BSON_EXTRA_ALIGNMENT: 1 + ENABLE_TESTS: "ON" + USE_SANITIZER_UBSAN: "ON" + - func: fetch-det + - func: run_kms_servers + - func: test + vars: + MONGOCXX_TEST_TOPOLOGY: single + TEST_WITH_UBSAN: "ON" + example_projects_cc: clang + example_projects_cxx: clang++ + example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan - name: sanitizers-ubsan-rhel80-clang-static-latest-replica run_on: rhel80-large tags: [sanitizers, ubsan, rhel80, clang, static, latest, replica] @@ -16189,7 +17125,7 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan - name: sanitizers-ubsan-rhel80-clang-static-latest-sharded run_on: rhel80-large tags: [sanitizers, ubsan, rhel80, clang, static, latest, sharded] @@ -16224,7 +17160,7 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan - name: sanitizers-ubsan-rhel80-clang-static-latest-single run_on: rhel80-large tags: [sanitizers, ubsan, rhel80, clang, static, latest, single] @@ -16258,7 +17194,7 @@ tasks: example_projects_cc: clang example_projects_cxx: clang++ example_projects_cxxflags: -fsanitize=undefined -fno-sanitize-recover=undefined -fno-omit-frame-pointer - example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined + example_projects_ldflags: -fsanitize=undefined -fno-sanitize-recover=undefined -static-libsan - name: scan-build-rhel80-std11-default run_on: rhel80-large tags: [scan-build, rhel80, std11] diff --git a/src/bsoncxx/lib/CMakeLists.txt b/src/bsoncxx/lib/CMakeLists.txt index 02a5c2f8c2..282ed5b9d9 100644 --- a/src/bsoncxx/lib/CMakeLists.txt +++ b/src/bsoncxx/lib/CMakeLists.txt @@ -86,6 +86,7 @@ set_dist_list(src_bsoncxx_lib_DIST ${bsoncxx_sources_private} ${bsoncxx_sources_v_noabi} ${bsoncxx_sources_v1} + bsoncxx/private/aligned_storage.hh bsoncxx/private/b64_ntop.hh bsoncxx/private/config/config.hh.in bsoncxx/private/convert.hh diff --git a/src/bsoncxx/lib/bsoncxx/private/aligned_storage.hh b/src/bsoncxx/lib/bsoncxx/private/aligned_storage.hh new file mode 100644 index 0000000000..fcb84f8a17 --- /dev/null +++ b/src/bsoncxx/lib/bsoncxx/private/aligned_storage.hh @@ -0,0 +1,54 @@ +// Copyright 2009-present MongoDB, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#pragma once + +#include + +#include +#include + +namespace bsoncxx { + +// Workaround lack of aligned allocation support prior to C++17. +// +// Unlike `std::aligned_storage` and `alignas`, this type does NOT propagate alignment requirements to the parent +// object. This permits correct behavior despite use with regular (alignment-unaware) allocation functions. +// +// `alignof(T)` must be explicitly provided by the user for correct behavior, as template parameters do not necessarily +// inherit attributes such as alignment, e.g. `std::size_t alignment = alignof(T)` does not work as expected. +template +class aligned_storage { + // Sanity check. + static_assert(size >= alignment, "sizeof(T) >= alignof(T) must be true"); + + private: + // We only need at most `alignment` additional bytes to guarantee enough space for alignment. + unsigned char _storage[size + alignment]; + + public: + void* get() BSONCXX_PRIVATE_IF_GNU_LIKE(__attribute__((assume_aligned(alignment)))) + { + void* ptr = _storage; + std::size_t space = sizeof(_storage); + return std::align(alignment, size, ptr, space); + } + + void const* get() const BSONCXX_PRIVATE_IF_GNU_LIKE(__attribute__((assume_aligned(alignment)))) + { + return const_cast(this)->get(); + } +}; + +} // namespace bsoncxx diff --git a/src/bsoncxx/lib/bsoncxx/private/stack.hh b/src/bsoncxx/lib/bsoncxx/private/stack.hh index e1f8c2f7b0..caf08c27ba 100644 --- a/src/bsoncxx/lib/bsoncxx/private/stack.hh +++ b/src/bsoncxx/lib/bsoncxx/private/stack.hh @@ -18,6 +18,8 @@ #include #include +#include + namespace bsoncxx { // Note: This stack is only intended for use with the 'frame' type in @@ -78,6 +80,17 @@ class stack { new (_get_ptr()) T(std::forward(args)...); } + template + void emplace_back(bson_t* bson, Args&&... args) { + if (_is_empty) { + _is_empty = false; + } else { + _inc(); + } + + new (_get_ptr()) T(bson, std::forward(args)...); + } + void pop_back() { _get_ptr()->close(); _dec(); @@ -92,7 +105,7 @@ class stack { } private: - typename std::aligned_storage::type _object_memory[size]; + alignas(T) unsigned char _object_memory[size * sizeof(T)]; std::list _buckets; diff --git a/src/bsoncxx/lib/bsoncxx/v_noabi/bsoncxx/builder/core.cpp b/src/bsoncxx/lib/bsoncxx/v_noabi/bsoncxx/builder/core.cpp index ccafacd58e..1b06149488 100644 --- a/src/bsoncxx/lib/bsoncxx/v_noabi/bsoncxx/builder/core.cpp +++ b/src/bsoncxx/lib/bsoncxx/v_noabi/bsoncxx/builder/core.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -44,7 +45,7 @@ void bson_free_deleter(std::uint8_t* ptr) { class managed_bson_t { public: managed_bson_t() { - bson_init(&bson); + bson_init(bson_ptr); } managed_bson_t(managed_bson_t&&) = delete; @@ -54,15 +55,16 @@ class managed_bson_t { managed_bson_t& operator=(managed_bson_t const&) = delete; ~managed_bson_t() { - bson_destroy(&bson); + bson_destroy(bson_ptr); } bson_t* get() { - return &bson; + return bson_ptr; } private: - bson_t bson; + bsoncxx::aligned_storage bson_storage; + bson_t* bson_ptr = new (bson_storage.get()) bson_t; }; } // namespace @@ -115,7 +117,7 @@ class core::impl { if (_stack.empty()) { return _root.get(); } else { - return &_stack.back().bson; + return _stack.back().bson_ptr; } } @@ -201,14 +203,22 @@ class core::impl { private: struct frame { + ~frame() = default; + + frame(frame&&) = delete; + frame& operator=(frame&&) = delete; + + frame(frame const&) = delete; + frame& operator=(frame const&) = delete; + frame(bson_t* parent, char const* key, std::int32_t len, bool is_array) : n(0), is_array(is_array), parent(parent) { if (is_array) { - if (!bson_append_array_begin(parent, key, len, &bson)) { + if (!bson_append_array_begin(parent, key, len, bson_ptr)) { throw bsoncxx::v_noabi::exception{error_code::k_cannot_begin_appending_array}; } } else { - if (!bson_append_document_begin(parent, key, len, &bson)) { + if (!bson_append_document_begin(parent, key, len, bson_ptr)) { throw bsoncxx::v_noabi::exception{error_code::k_cannot_begin_appending_document}; } } @@ -216,11 +226,11 @@ class core::impl { void close() { if (is_array) { - if (!bson_append_array_end(parent, &bson)) { + if (!bson_append_array_end(parent, bson_ptr)) { throw bsoncxx::v_noabi::exception{error_code::k_cannot_end_appending_array}; } } else { - if (!bson_append_document_end(parent, &bson)) { + if (!bson_append_document_end(parent, bson_ptr)) { throw bsoncxx::v_noabi::exception{error_code::k_cannot_end_appending_document}; } } @@ -228,7 +238,8 @@ class core::impl { std::size_t n; bool is_array; - bson_t bson; + bsoncxx::aligned_storage bson_storage; + bson_t* bson_ptr = new (bson_storage.get()) bson_t; bson_t* parent; }; diff --git a/src/mongocxx/lib/mongocxx/private/client_session.hh b/src/mongocxx/lib/mongocxx/private/client_session.hh index f12442c2a4..8b69ce56a3 100644 --- a/src/mongocxx/lib/mongocxx/private/client_session.hh +++ b/src/mongocxx/lib/mongocxx/private/client_session.hh @@ -25,6 +25,7 @@ #include +#include #include #include @@ -123,7 +124,7 @@ class client_session::impl { return bsoncxx::helpers::view_from_bson_t(ct); } - return bsoncxx::helpers::view_from_bson_t(&_empty_cluster_time); + return bsoncxx::helpers::view_from_bson_t(_empty_cluster_time_ptr); } bsoncxx::v_noabi::types::b_timestamp operation_time() const noexcept { @@ -236,7 +237,9 @@ class client_session::impl { unique_session _session_t; - bson_t _empty_cluster_time = BSON_INITIALIZER; + // Just a long-lasting empty bson_t. Destruction is not required. + bsoncxx::aligned_storage _empty_cluster_time_storage; + bson_t const* _empty_cluster_time_ptr = new (_empty_cluster_time_storage.get()) bson_t BSON_INITIALIZER; }; } // namespace v_noabi diff --git a/src/mongocxx/lib/mongocxx/private/mock.hh b/src/mongocxx/lib/mongocxx/private/mock.hh index e584ef0bad..f9494c7086 100644 --- a/src/mongocxx/lib/mongocxx/private/mock.hh +++ b/src/mongocxx/lib/mongocxx/private/mock.hh @@ -14,6 +14,8 @@ #pragma once +#include + #include #include #include @@ -28,14 +30,64 @@ #include +#include + namespace mongocxx { namespace test_util { +template +struct mock_invoke_fn { + template + static R invoke(Self self, Args... args) { + auto crtp = static_cast(self); + auto instance = crtp->active_instance(); + if (instance) { + while (!instance->_callbacks.empty()) { + if (instance->_callbacks.top()._conditional(args...)) { + return instance->_callbacks.top()._callback(args...); + } + instance->_callbacks.pop(); + } + } + + return crtp->_func(args...); + } +}; + +template +struct mock_invoke; + +template +struct mock_invoke { + R operator()(Args... args) { + return mock_invoke_fn::invoke(this, args...); + } +}; + +BSONCXX_PRIVATE_WARNINGS_PUSH(); +BSONCXX_PRIVATE_WARNINGS_DISABLE(GNU("-Wignored-attributes")); + +template +struct mock_invoke { + bson_t const* operator()(Args... args) { + return mock_invoke_fn::invoke(this, args...); + } +}; + +template +struct mock_invoke { + bson_t* operator()(Args... args) { + return mock_invoke_fn::invoke(this, args...); + } +}; + +BSONCXX_PRIVATE_WARNINGS_POP(); + template class mock; template -class mock { +class mock : public mock_invoke, R(Args...)> { public: using underlying_ptr = R (*)(Args...); using callback = std::function; @@ -43,6 +95,7 @@ class mock { class rule { friend mock; + friend mock_invoke_fn, R>; public: rule(callback callback) : _callback(std::move(callback)) { @@ -68,6 +121,7 @@ class mock { class instance { friend mock; + friend mock_invoke_fn, R>; public: instance(instance const&) = delete; @@ -126,26 +180,13 @@ class mock { }; friend instance; + friend mock_invoke_fn, R>; mock(underlying_ptr func) : _func(std::move(func)) {} mock(mock&&) = delete; mock(mock const&) = delete; mock& operator=(mock const&) = delete; - R operator()(Args... args) { - auto instance = active_instance(); - if (instance) { - while (!instance->_callbacks.empty()) { - if (instance->_callbacks.top()._conditional(args...)) { - return instance->_callbacks.top()._callback(args...); - } - instance->_callbacks.pop(); - } - } - - return _func(args...); - } - std::unique_ptr create_instance() { std::unique_ptr mock_instance(new instance(this)); active_instance(mock_instance.get()); diff --git a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/instance.cpp b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/instance.cpp index dff56735a1..61ad506ed9 100644 --- a/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/instance.cpp +++ b/src/mongocxx/lib/mongocxx/v_noabi/mongocxx/instance.cpp @@ -75,7 +75,7 @@ void user_log_handler( // A region of memory that acts as a sentintel value indicating that an instance object is being // destroyed. We only care about the address of this object, never its contents. -typename std::aligned_storage::type sentinel; +alignas(instance) unsigned char sentinel[sizeof(instance)]; std::atomic current_instance{nullptr}; static_assert(std::is_standard_layout::value, "Must be standard layout");