Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 19 additions & 1 deletion MODULE.bazel
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ git_override(

bazel_dep(name = "score_tooling", version = "1.1.2")

# Centralized sanitizer policies (ASan, TSan, UBSan, LSan)
bazel_dep(name = "score_cpp_policies", version = "0.0.0", dev_dependency = True)
git_override(
module_name = "score_cpp_policies",
commit = "75b7fbfe709a003899ebfe0bbbb948590236e925", # tip of rs/swp-245137 branch
remote = "https://github.com/RSingh1511/score_cpp_policies.git",
)

# Dependencies required for development that will not get propagated to our users as transitive dependencies
bazel_dep(name = "gcc_toolchain", version = "0.9.0", dev_dependency = True)

Expand Down Expand Up @@ -128,7 +136,12 @@ toolchains_qnx.sdp(
)
use_repo(toolchains_qnx, "toolchains_qnx_ifs")

bazel_dep(name = "toolchains_llvm", version = "1.5.0", dev_dependency = True)
bazel_dep(name = "toolchains_llvm", version = "1.7.0", dev_dependency = True)
git_override(
module_name = "toolchains_llvm",
commit = "576a587e4542733166ac1c3c4fb14c79c421332c",
remote = "https://github.com/bazel-contrib/toolchains_llvm",
)

llvm = use_extension(
"@toolchains_llvm//toolchain/extensions:llvm.bzl",
Expand All @@ -150,12 +163,17 @@ llvm.toolchain(
"-Wthread-safety",
]},
cxx_standard = {"": "c++17"},
extra_known_features = [
"@score_cpp_policies//sanitizers/features:asan_ubsan_lsan",
"@score_cpp_policies//sanitizers/features:tsan",
],
link_libs = {"": [
"-lrt",
# This is the agreed way to ensure linking for targets using std::atomic operations.
"-latomic",
]},
llvm_version = "19.1.7",
stdlib = {"": "stdc++"},
)
use_repo(llvm, "llvm_toolchain")

Expand Down
10 changes: 5 additions & 5 deletions quality/integration_testing/integration_testing.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,14 @@ def integration_test(name, srcs, filesystem, **kwargs):
}),
os = "linux",
env = select({
"//quality/sanitizer/flags:none": None,
"//quality/sanitizer/flags:any_sanitizer": "//quality/sanitizer:absolute_env",
"@score_cpp_policies//sanitizers/flags:none": None,
"@score_cpp_policies//sanitizers/flags:any_sanitizer": "@score_cpp_policies//sanitizers:absolute_env",
}),
tars = [
filesystem,
] + select({
"//quality/sanitizer/flags:none": [],
"//quality/sanitizer/flags:any_sanitizer": ["//quality/sanitizer:suppressions_pkg"],
"@score_cpp_policies//sanitizers/flags:none": [],
"@score_cpp_policies//sanitizers/flags:any_sanitizer": ["//quality/integration_testing/sanitizer_support:suppressions_pkg"],
}) + [
"@ubuntu24_04//:ubuntu24_04",
],
Expand Down Expand Up @@ -167,7 +167,7 @@ def integration_test(name, srcs, filesystem, **kwargs):
_extend_list_in_kwargs_without_duplicates(
kwargs,
"target_compatible_with",
["//quality/sanitizer/constraints:no_tsan"],
["@score_cpp_policies//sanitizers/constraints:no_tsan"],
)

_extend_list_in_kwargs_without_duplicates(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# *******************************************************************************
# Copyright (c) 2025 Contributors to the Eclipse Foundation
# Copyright (c) 2026 Contributors to the Eclipse Foundation
#
# See the NOTICE file(s) distributed with this work for additional
# information regarding copyright ownership.
Expand All @@ -11,17 +11,15 @@
# SPDX-License-Identifier: Apache-2.0
# *******************************************************************************

cc_test(
name = "asan_fail_heap_out_of_bounds",
srcs = ["asan_fail_heap_out_of_bounds.cpp"],
)

cc_test(
name = "lsan_fail_leak",
srcs = ["lsan_fail_leak.cpp"],
)
load("@rules_pkg//pkg:tar.bzl", "pkg_tar")

cc_test(
name = "tsan_fail_data_race",
srcs = ["tsan_fail_data_race.cpp"],
pkg_tar(
name = "suppressions_pkg",
srcs = [
"//quality/sanitizer:repo_suppressions",
"@score_cpp_policies//sanitizers:suppressions",
],
mode = "0444",
package_dir = "sanitizers/suppressions",
visibility = ["//visibility:public"],
)
93 changes: 7 additions & 86 deletions quality/sanitizer/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -11,92 +11,13 @@
# SPDX-License-Identifier: Apache-2.0
# *******************************************************************************

load("@rules_pkg//pkg:tar.bzl", "pkg_tar")
load("//bazel/rules:expand_template.bzl", "expand_template")

sh_test(
name = "sanitizers_functional_test",
srcs = ["sanitizers_functional_test.sh"],
data = [
"sanitizer.bazelrc",
"test_workspace/BUILD.tpl",
"test_workspace/MODULE.bazel",
"test_workspace/asan_fail_heap_out_of_bounds.cpp",
"test_workspace/lsan_fail_leak.cpp",
"test_workspace/tsan_fail_data_race.cpp",
],
env_inherit = [
"PATH",
"http_proxy",
"https_proxy",
],
tags = [
"local", # Test marked local because it uses bazel.
"manual", # Due to long-runtime and local dependencies
],
deps = ["@bazel_tools//tools/bash/runfiles"],
)

filegroup(
name = "env_template",
srcs = select({
"//quality/sanitizer/flags:tsan": ["tsan.env.template"],
"//quality/sanitizer/flags:asan_ubsan_lsan": ["asan_ubsan_lsan.env.template"],
}),
target_compatible_with = ["//quality/sanitizer/constraints:any_sanitizer"],
)

[
expand_template(
name = name + "_env",
out = name + "_sanitizer.env",
substitutions = {
"%ROOT%": root,
},
target_compatible_with = ["//quality/sanitizer/constraints:any_sanitizer"],
template = ":env_template",
visibility = ["//:__subpackages__"],
)
for name, root in (
[
"absolute",
"/",
],
[
"relative",
"./",
],
)
]

filegroup(
name = "suppressions",
srcs = select({
"//quality/sanitizer/flags:tsan": ["tsan.supp"],
"//quality/sanitizer/flags:asan_ubsan_lsan": [
"asan.supp",
"lsan.supp",
"ubsan.supp",
],
}),
target_compatible_with = ["//quality/sanitizer/constraints:any_sanitizer"],
)

pkg_tar(
name = "suppressions_pkg",
srcs = [":suppressions"],
mode = "0444",
package_dir = "quality/sanitizer",
target_compatible_with = ["//quality/sanitizer/constraints:any_sanitizer"],
visibility = ["//:__subpackages__"],
)

sh_binary(
name = "wrapper",
srcs = ["wrapper.sh"],
data = [
":relative_env",
":suppressions",
name = "repo_suppressions",
srcs = [
"asan.supp",
"lsan.supp",
"tsan.supp",
"ubsan.supp",
],
target_compatible_with = ["//quality/sanitizer/constraints:any_sanitizer"],
visibility = ["//quality/integration_testing/sanitizer_support:__pkg__"],
)
3 changes: 0 additions & 3 deletions quality/sanitizer/asan_ubsan_lsan.env.template

This file was deleted.

49 changes: 0 additions & 49 deletions quality/sanitizer/constraints/BUILD

This file was deleted.

51 changes: 0 additions & 51 deletions quality/sanitizer/flags/BUILD

This file was deleted.

9 changes: 0 additions & 9 deletions quality/sanitizer/lsan.supp
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,3 @@
# See: https://github.com/google/sanitizers/wiki/AddressSanitizerLeakSanitizer#suppressions
# Every suppression requires a justification.
# Suppressions that share the same justification may be organized in a single block.

# Rust's standard runtime (std::rt::lang_start) allocates thread-local storage (TLS) that is not
# cleaned up at the time LSan runs its atexit sweep. LSan reports this as a memory leak because
# TLS destructors are invoked after LSan's atexit handler, so the memory appears live but
# unreachable at leak-check time. This affects all Rust binaries regardless of async runtime used.
# Rust sanitizer support upstream: https://github.com/rust-lang/rust/issues/39699.
# We plan to re-verify the behavior and perform further analysis under Ticket-252536.

leak:std::rt::lang_start
42 changes: 17 additions & 25 deletions quality/sanitizer/sanitizer.bazelrc
Comment thread
LittleHuba marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -11,35 +11,27 @@
# SPDX-License-Identifier: Apache-2.0
# *******************************************************************************

# todo: Extract to toolchain feature once possible

test:with_debug_symbols --cxxopt -gline-tables-only
test:with_debug_symbols --cxxopt -gcolumn-info
test:with_debug_symbols --strip=never
# ==============================================================================
# Sanitizer Configurations (adapted from @score_cpp_policies)
# ==============================================================================

# ASan + UBSan + LSan (Combined)
test:asan_ubsan_lsan --extra_toolchains=@llvm_toolchain//:cc-toolchain-x86_64-linux
test:asan_ubsan_lsan --extra_toolchains=@ferrocene_x86_64_unknown_linux_gnu_llvm//:rust_ferrocene_toolchain
test:asan_ubsan_lsan --config=with_debug_symbols
test:asan_ubsan_lsan --run_under=//quality/sanitizer:wrapper
test:asan_ubsan_lsan --//quality/sanitizer/flags:sanitizer=asan_ubsan_lsan
test:asan_ubsan_lsan --cxxopt -fsanitize=undefined,address,leak
test:asan_ubsan_lsan --cxxopt -fno-omit-frame-pointer
test:asan_ubsan_lsan --cxxopt -fno-common
test:asan_ubsan_lsan --linkopt -fsanitize=undefined,address,leak
test:asan_ubsan_lsan --linkopt -fsanitize-link-c++-runtime
test:asan_ubsan_lsan --platform_suffix=asan_ubsan
test:asan_ubsan_lsan --features=asan_ubsan_lsan_link
build:asan_ubsan_lsan --platform_suffix=asan_ubsan_lsan
test:asan_ubsan_lsan --@score_cpp_policies//sanitizers/flags:sanitizer=asan_ubsan_lsan
test:asan_ubsan_lsan --run_under=@score_cpp_policies//sanitizers:wrapper

test:asan --config=asan_ubsan_lsan
test:ubsan --config=asan_ubsan_lsan
test:lsan --config=asan_ubsan_lsan
# Shortcuts for individual sanitizers
build:asan --config=asan_ubsan_lsan
build:ubsan --config=asan_ubsan_lsan
build:lsan --config=asan_ubsan_lsan

# ThreadSanitizer
test:tsan --extra_toolchains=@llvm_toolchain//:cc-toolchain-x86_64-linux
test:tsan --extra_toolchains=@ferrocene_x86_64_unknown_linux_gnu_llvm//:rust_ferrocene_toolchain
test:tsan --config=with_debug_symbols
test:tsan --run_under=//quality/sanitizer:wrapper
test:tsan --//quality/sanitizer/flags:sanitizer=tsan
test:tsan --cxxopt -fsanitize=thread
test:tsan --cxxopt -O1
test:tsan --linkopt -fsanitize=thread
test:tsan --linkopt -fsanitize-link-c++-runtime
test:tsan --platform_suffix=tsan
test:tsan --features=tsan_link
build:tsan --platform_suffix=tsan
test:tsan --@score_cpp_policies//sanitizers/flags:sanitizer=tsan
test:tsan --run_under=@score_cpp_policies//sanitizers:wrapper
Loading
Loading