Skip to content

Commit 9324c95

Browse files
committed
[Driver] -fsanitize=numerical: work with ubsan and support -shared-libsan
* `-fsanitize=numerical,undefined`: don't link in the ubsan standalone runtime. * `-shared-libsan`: link against `libclang_rt.nsan.so` The compiler-rt part will be properly fixed by #98415
1 parent 54c32be commit 9324c95

File tree

3 files changed

+23
-3
lines changed

3 files changed

+23
-3
lines changed

clang/lib/Driver/SanitizerArgs.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -285,8 +285,8 @@ bool SanitizerArgs::needsFuzzerInterceptors() const {
285285

286286
bool SanitizerArgs::needsUbsanRt() const {
287287
// All of these include ubsan.
288-
if (needsAsanRt() || needsMsanRt() || needsHwasanRt() || needsTsanRt() ||
289-
needsDfsanRt() || needsLsanRt() || needsCfiDiagRt() ||
288+
if (needsAsanRt() || needsMsanRt() || needsNsanRt() || needsHwasanRt() ||
289+
needsTsanRt() || needsDfsanRt() || needsLsanRt() || needsCfiDiagRt() ||
290290
(needsScudoRt() && !requiresMinimalRuntime()))
291291
return false;
292292

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1409,6 +1409,8 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
14091409
if (!Args.hasArg(options::OPT_shared) && !TC.getTriple().isAndroid())
14101410
HelperStaticRuntimes.push_back("memprof-preinit");
14111411
}
1412+
if (SanArgs.needsNsanRt())
1413+
SharedRuntimes.push_back("nsan");
14121414
if (SanArgs.needsUbsanRt()) {
14131415
if (SanArgs.requiresMinimalRuntime())
14141416
SharedRuntimes.push_back("ubsan_minimal");
@@ -1479,7 +1481,7 @@ collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
14791481
if (SanArgs.linkCXXRuntimes())
14801482
StaticRuntimes.push_back("msan_cxx");
14811483
}
1482-
if (SanArgs.needsNsanRt())
1484+
if (!SanArgs.needsSharedRt() && SanArgs.needsNsanRt())
14831485
StaticRuntimes.push_back("nsan");
14841486
if (!SanArgs.needsSharedRt() && SanArgs.needsTsanRt()) {
14851487
StaticRuntimes.push_back("tsan");

clang/test/Driver/sanitizer-ld.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,24 @@
646646
// CHECK-NSAN-LINUX: libclang_rt.nsan.a"
647647
// CHECK-NSAN-LINUX: "-lpthread" "-lrt" "-lm" "-ldl" "-lresolv"
648648

649+
// RUN: %clang -### %s 2>&1 --target=x86_64-unknown-linux -fuse-ld=ld -fsanitize=numerical -shared-libsan \
650+
// RUN: -resource-dir=%S/Inputs/resource_dir \
651+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
652+
// RUN: | FileCheck --check-prefix=CHECK-NSAN-SHARED-LINUX %s
653+
654+
// CHECK-NSAN-SHARED-LINUX: libclang_rt.nsan.so"
655+
// CHECK-NSAN-SHARED-LINUX-NOT: "-lpthread"
656+
// CHECK-NSAN-SHARED-LINUX-NOT: "-ldl"
657+
// CHECK-NSAN-SHARED-LINUX-NOT: "--dynamic-list
658+
659+
// RUN: %clang -### %s 2>&1 --target=x86_64-unknown-linux -fsanitize=numerical,undefined \
660+
// RUN: -resource-dir=%S/Inputs/resource_dir \
661+
// RUN: --sysroot=%S/Inputs/basic_linux_tree \
662+
// RUN: | FileCheck --check-prefix=CHECK-NSAN-UBSAN %s
663+
664+
// CHECK-NSAN-UBSAN: "--whole-archive" "{{[^"]*}}libclang_rt.nsan.a" "--no-whole-archive"
665+
// CHECK-NSAN-UBSAN-NOT: libclang_rt.ubsan
666+
649667
// CFI by itself does not link runtime libraries.
650668
// RUN: not %clang -fsanitize=cfi -### %s 2>&1 \
651669
// RUN: --target=x86_64-unknown-linux -fuse-ld=ld -rtlib=platform \

0 commit comments

Comments
 (0)