From 174341890ebe9ad7034eb4da5b86fb34c2541bce Mon Sep 17 00:00:00 2001 From: "Yurii T." Date: Sat, 7 Mar 2026 05:12:55 +0000 Subject: [PATCH 1/4] Add ubsan libs --- cc/config/llvm18_linux_x86_64.BUILD | 8 ++++++++ cc/config/llvm19_linux_x86_64.BUILD | 8 ++++++++ cc/config/llvm20_linux_x86_64.BUILD | 8 ++++++++ cc/config/llvm21_linux_x86_64.BUILD | 8 ++++++++ 4 files changed, 32 insertions(+) diff --git a/cc/config/llvm18_linux_x86_64.BUILD b/cc/config/llvm18_linux_x86_64.BUILD index e3a99182..1606575f 100644 --- a/cc/config/llvm18_linux_x86_64.BUILD +++ b/cc/config/llvm18_linux_x86_64.BUILD @@ -148,6 +148,14 @@ cc_toolchain_import( visibility = ["//visibility:public"], ) +cc_toolchain_import( + name = "rt_ubsan", + additional_libs = glob([ + "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan*".format(clang_version = CLANG_VERSION), + ]), + visibility = ["//visibility:public"], +) + #============================================================================================ # CUDA diff --git a/cc/config/llvm19_linux_x86_64.BUILD b/cc/config/llvm19_linux_x86_64.BUILD index 4202d168..6959434a 100644 --- a/cc/config/llvm19_linux_x86_64.BUILD +++ b/cc/config/llvm19_linux_x86_64.BUILD @@ -146,6 +146,14 @@ cc_toolchain_import( visibility = ["//visibility:public"], ) +cc_toolchain_import( + name = "rt_ubsan", + additional_libs = glob([ + "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan*".format(clang_version = CLANG_VERSION), + ]), + visibility = ["//visibility:public"], +) + #============================================================================================ # CUDA diff --git a/cc/config/llvm20_linux_x86_64.BUILD b/cc/config/llvm20_linux_x86_64.BUILD index 7eca8123..b03d45a3 100644 --- a/cc/config/llvm20_linux_x86_64.BUILD +++ b/cc/config/llvm20_linux_x86_64.BUILD @@ -146,6 +146,14 @@ cc_toolchain_import( visibility = ["//visibility:public"], ) +cc_toolchain_import( + name = "rt_ubsan", + additional_libs = glob([ + "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan*".format(clang_version = CLANG_VERSION), + ]), + visibility = ["//visibility:public"], +) + #============================================================================================ # CUDA diff --git a/cc/config/llvm21_linux_x86_64.BUILD b/cc/config/llvm21_linux_x86_64.BUILD index f5bc2da8..ea979bec 100644 --- a/cc/config/llvm21_linux_x86_64.BUILD +++ b/cc/config/llvm21_linux_x86_64.BUILD @@ -146,6 +146,14 @@ cc_toolchain_import( visibility = ["//visibility:public"], ) +cc_toolchain_import( + name = "rt_ubsan", + additional_libs = glob([ + "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.ubsan*".format(clang_version = CLANG_VERSION), + ]), + visibility = ["//visibility:public"], +) + #============================================================================================ # CUDA From 3f8c8d27f1545fee187210cf8492967831e5d522 Mon Sep 17 00:00:00 2001 From: "Yurii T." Date: Sat, 7 Mar 2026 05:16:51 +0000 Subject: [PATCH 2/4] Add ubsan libs to Linux aarch64 --- cc/config/llvm18_linux_aarch64.BUILD | 21 +++++++++++++-------- cc/config/llvm20_linux_aarch64.BUILD | 21 +++++++++++++-------- cc/config/llvm21_linux_aarch64.BUILD | 21 +++++++++++++-------- 3 files changed, 39 insertions(+), 24 deletions(-) diff --git a/cc/config/llvm18_linux_aarch64.BUILD b/cc/config/llvm18_linux_aarch64.BUILD index 1a1c043f..98b2007d 100644 --- a/cc/config/llvm18_linux_aarch64.BUILD +++ b/cc/config/llvm18_linux_aarch64.BUILD @@ -132,20 +132,25 @@ filegroup( cc_toolchain_import( name = "rt_asan", additional_libs = glob([ - "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.asan*".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.gwp_asan.a".format(clang_version = CLANG_VERSION), + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.asan*".format(clang_version = CLANG_VERSION), + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.gwp_asan.a".format(clang_version = CLANG_VERSION), ]), visibility = ["//visibility:public"], ) cc_toolchain_import( name = "rt_tsan", - additional_libs = [ - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan.a".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan.a.syms".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan_cxx.a".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan_cxx.a.syms".format(clang_version = CLANG_VERSION), - ], + additional_libs = glob([ + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan*".format(clang_version = CLANG_VERSION), + ]), + visibility = ["//visibility:public"], +) + +cc_toolchain_import( + name = "rt_ubsan", + additional_libs = glob([ + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.ubsan*".format(clang_version = CLANG_VERSION), + ]), visibility = ["//visibility:public"], ) diff --git a/cc/config/llvm20_linux_aarch64.BUILD b/cc/config/llvm20_linux_aarch64.BUILD index f4ebb930..c9b8f7b2 100644 --- a/cc/config/llvm20_linux_aarch64.BUILD +++ b/cc/config/llvm20_linux_aarch64.BUILD @@ -132,20 +132,25 @@ filegroup( cc_toolchain_import( name = "rt_asan", additional_libs = glob([ - "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.asan*".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.gwp_asan.a".format(clang_version = CLANG_VERSION), + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.asan*".format(clang_version = CLANG_VERSION), + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.gwp_asan.a".format(clang_version = CLANG_VERSION), ]), visibility = ["//visibility:public"], ) cc_toolchain_import( name = "rt_tsan", - additional_libs = [ - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan.a".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan.a.syms".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan_cxx.a".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan_cxx.a.syms".format(clang_version = CLANG_VERSION), - ], + additional_libs = glob([ + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan*".format(clang_version = CLANG_VERSION), + ]), + visibility = ["//visibility:public"], +) + +cc_toolchain_import( + name = "rt_ubsan", + additional_libs = glob([ + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.ubsan*".format(clang_version = CLANG_VERSION), + ]), visibility = ["//visibility:public"], ) diff --git a/cc/config/llvm21_linux_aarch64.BUILD b/cc/config/llvm21_linux_aarch64.BUILD index 362d3606..7906a8fd 100644 --- a/cc/config/llvm21_linux_aarch64.BUILD +++ b/cc/config/llvm21_linux_aarch64.BUILD @@ -132,20 +132,25 @@ filegroup( cc_toolchain_import( name = "rt_asan", additional_libs = glob([ - "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.asan*".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/x86_64-unknown-linux-gnu/libclang_rt.gwp_asan.a".format(clang_version = CLANG_VERSION), + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.asan*".format(clang_version = CLANG_VERSION), + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.gwp_asan.a".format(clang_version = CLANG_VERSION), ]), visibility = ["//visibility:public"], ) cc_toolchain_import( name = "rt_tsan", - additional_libs = [ - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan.a".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan.a.syms".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan_cxx.a".format(clang_version = CLANG_VERSION), - "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan_cxx.a.syms".format(clang_version = CLANG_VERSION), - ], + additional_libs = glob([ + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.tsan*".format(clang_version = CLANG_VERSION), + ]), + visibility = ["//visibility:public"], +) + +cc_toolchain_import( + name = "rt_ubsan", + additional_libs = glob([ + "lib/clang/{clang_version}/lib/aarch64-unknown-linux-gnu/libclang_rt.ubsan*".format(clang_version = CLANG_VERSION), + ]), visibility = ["//visibility:public"], ) From d09decbe710152ee2aca704e3e62dc2623f45a6d Mon Sep 17 00:00:00 2001 From: "Yurii T." Date: Sat, 7 Mar 2026 05:39:07 +0000 Subject: [PATCH 3/4] Replace multiple sanitizer rules by one universal --- cc/impls/linux_x86_64_linux_x86_64/BUILD | 42 +++++- cc/impls/linux_x86_64_linux_x86_64_cuda/BUILD | 42 +++++- cc/llvms/llvm_linux.BUILD.tpl | 6 + cc/sanitizers/features.bzl | 121 +++--------------- 4 files changed, 97 insertions(+), 114 deletions(-) diff --git a/cc/impls/linux_x86_64_linux_x86_64/BUILD b/cc/impls/linux_x86_64_linux_x86_64/BUILD index c5e173a1..01ba247e 100644 --- a/cc/impls/linux_x86_64_linux_x86_64/BUILD +++ b/cc/impls/linux_x86_64_linux_x86_64/BUILD @@ -18,9 +18,7 @@ # ============================================================================== load("//cc/layering_check:build_defs.bzl", "cc_toolchain_with_cppmap") -load("//cc/sanitizers:features.bzl", - "cc_toolchain_import_asan_feature", - "cc_toolchain_import_tsan_feature") +load("//cc/sanitizers:features.bzl", "cc_toolchain_import_sanitizer_feature") load("//third_party/rules_cc_toolchain:toolchain_config.bzl", "cc_toolchain_config") load("//third_party/rules_cc_toolchain/features:cc_toolchain_import.bzl", "cc_toolchain_import") load("//third_party/rules_cc_toolchain/features:features.bzl", "cc_toolchain_import_feature") @@ -87,16 +85,48 @@ cc_toolchain_import( ], ) -cc_toolchain_import_asan_feature( +cc_toolchain_import( + name = "ubsan_import", + deps = [ + "@llvm_linux_x86_64//:libclang_rt", + "@llvm_linux_x86_64//:rt_ubsan", + ], +) + +cc_toolchain_import_sanitizer_feature( name = "asan", + compiler_flags = [ + "-fsanitize=address", + "-fno-common", + ], + linker_flags = [ + "-fsanitize=address", + ], toolchain_import = ":asan_import", ) -cc_toolchain_import_tsan_feature( +cc_toolchain_import_sanitizer_feature( name = "tsan", + compiler_flags = [ + "-fsanitize=thread", + ], + linker_flags = [ + "-fsanitize=thread", + ], toolchain_import = ":tsan_import", ) +cc_toolchain_import_sanitizer_feature( + name = "ubsan", + compiler_flags = [ + "-fsanitize=undefined", + ], + linker_flags = [ + "-fsanitize=undefined", + ], + toolchain_import = ":ubsan_import", +) + # buildifier: leave-alone filegroup( name = "all", @@ -114,6 +144,7 @@ filegroup( srcs = [ ":asan_import", ":tsan_import", + ":ubsan_import", ":imports", ":wrappers", "@llvm_linux_x86_64//:clang", @@ -207,6 +238,7 @@ FEATURES_ESSENTIAL = [ # Sanitizers ":asan", ":tsan", + ":ubsan" ] cc_toolchain_config( diff --git a/cc/impls/linux_x86_64_linux_x86_64_cuda/BUILD b/cc/impls/linux_x86_64_linux_x86_64_cuda/BUILD index 361cfd85..b172800a 100644 --- a/cc/impls/linux_x86_64_linux_x86_64_cuda/BUILD +++ b/cc/impls/linux_x86_64_linux_x86_64_cuda/BUILD @@ -20,9 +20,7 @@ load("@local_config_cuda//cuda:build_defs.bzl", "if_cuda", "if_cuda_hermetic_clang") load("@rules_cc//cc:defs.bzl", "cc_toolchain") load("//cc/layering_check:build_defs.bzl", "cc_toolchain_with_cppmap") -load("//cc/sanitizers:features.bzl", - "cc_toolchain_import_asan_feature", - "cc_toolchain_import_tsan_feature") +load("//cc/sanitizers:features.bzl", "cc_toolchain_import_sanitizer_feature") load("//third_party/rules_cc_toolchain:toolchain_config.bzl", "cc_toolchain_config") load("//third_party/rules_cc_toolchain/features:cc_toolchain_import.bzl", "cc_toolchain_import") load("//third_party/rules_cc_toolchain/features:features.bzl", "cc_toolchain_import_feature") @@ -131,16 +129,48 @@ cc_toolchain_import( ], ) -cc_toolchain_import_asan_feature( +cc_toolchain_import( + name = "ubsan_import", + deps = [ + "@llvm_linux_x86_64//:libclang_rt", + "@llvm_linux_x86_64//:rt_ubsan", + ], +) + +cc_toolchain_import_sanitizer_feature( name = "asan", + compiler_flags = [ + "-fsanitize=address", + "-fno-common", + ], + linker_flags = [ + "-fsanitize=address", + ], toolchain_import = ":asan_import", ) -cc_toolchain_import_asan_feature( +cc_toolchain_import_sanitizer_feature( name = "tsan", + compiler_flags = [ + "-fsanitize=thread", + ], + linker_flags = [ + "-fsanitize=thread", + ], toolchain_import = ":tsan_import", ) +cc_toolchain_import_sanitizer_feature( + name = "ubsan", + compiler_flags = [ + "-fsanitize=undefined", + ], + linker_flags = [ + "-fsanitize=undefined", + ], + toolchain_import = ":ubsan_import", +) + # buildifier: leave-alone filegroup( name = "all", @@ -159,6 +189,7 @@ filegroup( srcs = [ ":asan_import", ":tsan_import", + ":ubsan_import", ":cuda_nvcc", ":imports", ":wrappers", @@ -256,6 +287,7 @@ FEATURES_ESSENTIAL = [ # Sanitizers ":asan", ":tsan", + ":ubsan" ] cc_toolchain_config( diff --git a/cc/llvms/llvm_linux.BUILD.tpl b/cc/llvms/llvm_linux.BUILD.tpl index a29fbf7d..349634af 100644 --- a/cc/llvms/llvm_linux.BUILD.tpl +++ b/cc/llvms/llvm_linux.BUILD.tpl @@ -111,6 +111,12 @@ alias( visibility = ["//visibility:public"], ) +alias( + name = "rt_ubsan", + actual = "@@%{llvm_repo_name}//:rt_ubsan", + visibility = ["//visibility:public"], +) + alias( name = "includes", actual = "@@%{llvm_repo_name}//:includes", diff --git a/cc/sanitizers/features.bzl b/cc/sanitizers/features.bzl index 189bb54d..802eacc0 100644 --- a/cc/sanitizers/features.bzl +++ b/cc/sanitizers/features.bzl @@ -69,28 +69,16 @@ def _filter_flags_by_keys(flags, keys): return libFlags -# ============================================================================================================= -# ASAN section - -ASAN_COMPILER_FLAGS = [ - "-fno-omit-frame-pointer", - "-fno-sanitize-recover=all", - "-fsanitize=address", - "-fno-common", # for backward compatibility with old toolchain sanitizer configuration -] - -ASAN_LINKER_FLAGS = [ - "-fsanitize=address", -] - -def _import_asan_feature_impl(ctx): +def _import_sanitizer_feature_impl(ctx): toolchain_import_info = ctx.attr.toolchain_import[CcToolchainImportInfo] - flag_sets = [] compiler_flags = depset([ flag - for flag in ASAN_COMPILER_FLAGS + for flag in ([ + "-fno-omit-frame-pointer", + "-fno-sanitize-recover=all", + ] + ctx.attr.compiler_flags) ]).to_list() if compiler_flags: @@ -105,7 +93,7 @@ def _import_asan_feature_impl(ctx): linker_flags = depset([ flag - for flag in ASAN_LINKER_FLAGS + for flag in ctx.attr.linker_flags ]).to_list() linker_dir_flags = depset([ @@ -141,8 +129,8 @@ def _import_asan_feature_impl(ctx): ) return [library_feature, ctx.attr.toolchain_import[DefaultInfo]] -cc_toolchain_import_asan_feature = rule( - _import_asan_feature_impl, +cc_toolchain_import_sanitizer_feature = rule( + _import_sanitizer_feature_impl, attrs = { "enabled": attr.bool(default = False), "provides": attr.string_list(), @@ -151,91 +139,16 @@ cc_toolchain_import_asan_feature = rule( mandatory = True, providers = [CcToolchainImportInfo], ), - }, - provides = [FeatureInfo, DefaultInfo], -) - - -#============================================================================================================== -# TSAN - -TSAN_COMPILER_FLAGS = [ - "-fno-omit-frame-pointer", - "-fno-sanitize-recover=all", - "-fsanitize=thread", -] - -TSAN_LINKER_FLAGS = [ - "-fsanitize=thread", # mandatory for linking -] - -def _import_tsan_feature_impl(ctx): - toolchain_import_info = ctx.attr.toolchain_import[CcToolchainImportInfo] - - flag_sets = [] - - compiler_flags = depset([ - flag - for flag in TSAN_COMPILER_FLAGS - ]).to_list() - - if compiler_flags: - flag_sets.append(flag_set( - actions = ALL_CC_COMPILE_ACTION_NAMES, - flag_groups = [ - flag_group( - flags = compiler_flags, - ), - ], - )) - - linker_flags = depset([ - flag - for flag in TSAN_LINKER_FLAGS - ]).to_list() - - linker_dir_flags = depset([ - "-L" + file.dirname - for file in toolchain_import_info - .linking_context.static_libraries.to_list() - ] + [ - "-L" + file.dirname - for file in toolchain_import_info - .linking_context.dynamic_libraries.to_list() - ] + [ - "-L" + file.dirname - for file in toolchain_import_info - .linking_context.additional_libs.to_list() - ]).to_list() - - if linker_flags or linker_dir_flags: - flag_sets.append(flag_set( - actions = SANITIZER_LINK_ACTIONS, - flag_groups = [ - flag_group( - flags = linker_flags + linker_dir_flags, - ), - ], - )) - - library_feature = _feature( - name = ctx.label.name, - enabled = ctx.attr.enabled, - flag_sets = flag_sets, - implies = ctx.attr.implies, - provides = ctx.attr.provides, - ) - return [library_feature, ctx.attr.toolchain_import[DefaultInfo]] - -cc_toolchain_import_tsan_feature = rule( - _import_tsan_feature_impl, - attrs = { - "enabled": attr.bool(default = False), - "provides": attr.string_list(), - "implies": attr.string_list(), - "toolchain_import": attr.label( + "compiler_flags": attr.string_list( + default = [], + doc = "The list of flags to pass to the compiler regardless of if \ +the target is a C or C++ library.", + mandatory = True, + ), + "linker_flags": attr.string_list( + default = [], + doc = "The list of flags to apply when linking.", mandatory = True, - providers = [CcToolchainImportInfo], ), }, provides = [FeatureInfo, DefaultInfo], From df0e0fa615841a7a48bf10ef33ed1096d6ab65dc Mon Sep 17 00:00:00 2001 From: "Yurii T." Date: Wed, 11 Mar 2026 19:43:48 +0000 Subject: [PATCH 4/4] Remove unused 'asan' target from sysroot --- cc/config/x86_64_ubuntu18_gcc8.4/sysroot.BUILD | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/cc/config/x86_64_ubuntu18_gcc8.4/sysroot.BUILD b/cc/config/x86_64_ubuntu18_gcc8.4/sysroot.BUILD index 9a24b056..9335fcf4 100644 --- a/cc/config/x86_64_ubuntu18_gcc8.4/sysroot.BUILD +++ b/cc/config/x86_64_ubuntu18_gcc8.4/sysroot.BUILD @@ -168,16 +168,6 @@ cc_toolchain_import( visibility = ["//visibility:private"], ) -cc_toolchain_import( - name = "asan", - additional_libs = [ - "usr/lib/gcc/x86_64-linux-gnu/{gcc_version}/libasan.so".format(gcc_version = GCC_VERSION), - "usr/lib/x86_64-linux-gnu/libasan.so.5", - "usr/lib/x86_64-linux-gnu/libasan.so.5.0.0", - ], - visibility = ["//visibility:private"], -) - cc_toolchain_import( name = "libc", additional_libs = [ @@ -205,7 +195,6 @@ cc_toolchain_import( ":dynamic_linker", ":libc", ":pthread", - ":asan", ], visibility = ["//visibility:public"], )