[clang] [Driver] Disable sanitizer ignorelists on Darwin (PR #195690)

via cfe-commits cfe-commits at lists.llvm.org
Mon May 4 10:05:58 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-driver

Author: Andrew Haberlandt (ndrewh)

<details>
<summary>Changes</summary>

The sanitizer transforms support an "ignorelist" mechanism for disabling instrumentation on specific functions. The clang driver current uses a default ignorelist (if it exists in the resource directory) -- this PR adds an option `CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS_DEFAULT` to control this "system ignorelist" behavior in the driver, and disables it by default on Darwin.

The ignorelists do not contain anything useful for Darwin, and they are causing issues with the (downstream) Swift clang importer.

Note that the ignorelists are currently installed by compiler-rt but consumed by the clang driver -- this change does not touch the compiler-rt code that installs these ignorelists. I think that these ignorelists (which control the behavior of the compiler) belong in clang rather than in compiler-rt, and I'm separately proposing that they be moved (#<!-- -->195396).

rdar://175962064

---
Full diff: https://github.com/llvm/llvm-project/pull/195690.diff


9 Files Affected:

- (modified) clang/CMakeLists.txt (+8) 
- (modified) clang/include/clang/Config/config.h.cmake (+3) 
- (modified) clang/lib/Driver/SanitizerArgs.cpp (+4) 
- (modified) clang/test/CMakeLists.txt (+1) 
- (added) clang/test/Driver/default-ignorelist.cpp (+29) 
- (modified) clang/test/Driver/fsanitize-ignorelist.c (-25) 
- (modified) clang/test/Frontend/dependency-gen.c (+4-3) 
- (modified) clang/test/lit.cfg.py (+3) 
- (modified) clang/test/lit.site.cfg.py.in (+1) 


``````````diff
diff --git a/clang/CMakeLists.txt b/clang/CMakeLists.txt
index 40506fc8a1546..7eca651b7929f 100644
--- a/clang/CMakeLists.txt
+++ b/clang/CMakeLists.txt
@@ -489,6 +489,14 @@ option(CLANG_ENABLE_STATIC_ANALYZER
 
 option(CLANG_ENABLE_PROTO_FUZZER "Build Clang protobuf fuzzer." OFF)
 
+if(APPLE)
+  # Darwin does not use the default system sanitizer ignorelists
+  set(CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS_DEFAULT OFF)
+else()
+  set(CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS_DEFAULT ON)
+endif()
+option(CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS "Clang will automatically add default ignorelists from the resource directory when an fsanitize option is provided." ${CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS_DEFAULT})
+
 if (DEFINED CLANG_ENABLE_ARCMT)
   set(CLANG_ENABLE_OBJC_REWRITER ${CLANG_ENABLE_ARCMT})
   message(DEPRECATION "'CLANG_ENABLE_ARCMT' is deprecated as ARCMigrate has been removed from Clang. Please use 'CLANG_ENABLE_OBJC_REWRITER' instead to enable or disable the Objective-C rewriter.")
diff --git a/clang/include/clang/Config/config.h.cmake b/clang/include/clang/Config/config.h.cmake
index 05e4deb671a7e..18f4e0b316364 100644
--- a/clang/include/clang/Config/config.h.cmake
+++ b/clang/include/clang/Config/config.h.cmake
@@ -91,4 +91,7 @@
 /* Policy to use for xcselect */
 #cmakedefine CLANG_XCSELECT_HOST_SDK_POLICY ${CLANG_XCSELECT_HOST_SDK_POLICY}
 
+/* Whether to use the default sanitizer ignorelists in the clang resource directory */
+#cmakedefine01 CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS
+
 #endif
diff --git a/clang/lib/Driver/SanitizerArgs.cpp b/clang/lib/Driver/SanitizerArgs.cpp
index 4ae46d0b6c9f1..6a85ed757c720 100644
--- a/clang/lib/Driver/SanitizerArgs.cpp
+++ b/clang/lib/Driver/SanitizerArgs.cpp
@@ -7,6 +7,7 @@
 //===----------------------------------------------------------------------===//
 #include "clang/Driver/SanitizerArgs.h"
 #include "clang/Basic/Sanitizers.h"
+#include "clang/Config/config.h"
 #include "clang/Driver/Driver.h"
 #include "clang/Driver/ToolChain.h"
 #include "clang/Options/Options.h"
@@ -191,6 +192,7 @@ static void validateSpecialCaseListFormat(const Driver &D,
     D.Diag(MalformedSCLErrorDiagID) << BLError;
 }
 
+[[maybe_unused]]
 static void addDefaultIgnorelists(const Driver &D, SanitizerMask Kinds,
                                   std::vector<std::string> &IgnorelistFiles,
                                   bool DiagnoseErrors) {
@@ -774,11 +776,13 @@ SanitizerArgs::SanitizerArgs(const ToolChain &TC,
                         options::OPT_fno_sanitize_annotate_debug_info_EQ);
   AnnotateDebugInfoKinds &= Kinds;
 
+#if CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS
   // Setup ignorelist files.
   // Add default ignorelist from resource directory for activated sanitizers,
   // and validate special case lists format.
   if (!Args.hasArgNoClaim(options::OPT_fno_sanitize_ignorelist))
     addDefaultIgnorelists(D, Kinds, SystemIgnorelistFiles, DiagnoseErrors);
+#endif
 
   // Parse -f(no-)?sanitize-ignorelist options.
   // This also validates special case lists format.
diff --git a/clang/test/CMakeLists.txt b/clang/test/CMakeLists.txt
index cb1f34d2e49bc..420d542608d50 100644
--- a/clang/test/CMakeLists.txt
+++ b/clang/test/CMakeLists.txt
@@ -11,6 +11,7 @@ llvm_canonicalize_cmake_booleans(
   CLANG_SPAWN_CC1
   CLANG_ENABLE_CIR
   CLANG_ENABLE_OBJC_REWRITER
+  CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS
   CLANG_LINK_CLANG_DYLIB
   CLANG_USE_XCSELECT
   ENABLE_BACKTRACES
diff --git a/clang/test/Driver/default-ignorelist.cpp b/clang/test/Driver/default-ignorelist.cpp
new file mode 100644
index 0000000000000..d5a5481199e62
--- /dev/null
+++ b/clang/test/Driver/default-ignorelist.cpp
@@ -0,0 +1,29 @@
+// XFAIL: !sanitizer-ignorelists
+// Test that ASan uses the default ignorelist from resource directory.
+// RUN: %clangxx -fsanitize=address -### %s 2>&1 | FileCheck %s
+// CHECK: fsanitize-system-ignorelist={{.*}}asan_ignorelist.txt
+
+// Check that the default ignorelist is not added as an extra dependency.
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=address -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-IGNORELIST-ASAN --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// CHECK-DEFAULT-IGNORELIST-ASAN: -fsanitize-system-ignorelist={{.*[^w]}}asan_ignorelist.txt
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=hwaddress -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-IGNORELIST-HWASAN --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// CHECK-DEFAULT-IGNORELIST-HWASAN: -fsanitize-system-ignorelist={{.*}}hwasan_ignorelist.txt
+
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=integer -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=nullability -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=alignment -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// Pass `--no-xcselect` to prevent the driver injecting -fdepfile-entry=<sysroot>/SDKSettings.json when xcselect is active.
+// RUN: %clang --target=%itanium_abi_triple --no-xcselect -fsanitize=float-divide-by-zero -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+// CHECK-DEFAULT-UBSAN-IGNORELIST: -fsanitize-system-ignorelist={{.*}}ubsan_ignorelist.txt
+
+// Check that combining ubsan and another sanitizer results in both ignorelists being used.
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined,address -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --check-prefix=CHECK-DEFAULT-IGNORELIST-ASAN --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
+
+// If cfi_ignorelist.txt cannot be found in the resource dir, driver should fail.
+// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=default -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-CFI-IGNORELIST
+// CHECK-MISSING-CFI-IGNORELIST: error: missing sanitizer ignorelist: '{{.*}}cfi_ignorelist.txt'
+
+// -fno-sanitize-ignorelist disables checking for cfi_ignorelist.txt in the resource dir.
+// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=default -fno-sanitize-ignorelist -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-CFI-NO-IGNORELIST
+// CHECK-MISSING-CFI-NO-IGNORELIST-NOT: error: no such file or directory: '{{.*}}cfi_ignorelist.txt'
diff --git a/clang/test/Driver/fsanitize-ignorelist.c b/clang/test/Driver/fsanitize-ignorelist.c
index 33645955d548e..d5dc8caf85f31 100644
--- a/clang/test/Driver/fsanitize-ignorelist.c
+++ b/clang/test/Driver/fsanitize-ignorelist.c
@@ -15,23 +15,6 @@
 // RUN: %clang --target=aarch64-linux-gnu -fsanitize=hwaddress -fsanitize-ignorelist=%t.good -fsanitize-ignorelist=%t.second %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-IGNORELIST
 // CHECK-IGNORELIST: -fsanitize-ignorelist={{.*}}.good" "-fsanitize-ignorelist={{.*}}.second
 
-// Check that the default ignorelist is not added as an extra dependency.
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=address -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-IGNORELIST-ASAN --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// CHECK-DEFAULT-IGNORELIST-ASAN: -fsanitize-system-ignorelist={{.*[^w]}}asan_ignorelist.txt
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=hwaddress -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-IGNORELIST-HWASAN --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// CHECK-DEFAULT-IGNORELIST-HWASAN: -fsanitize-system-ignorelist={{.*}}hwasan_ignorelist.txt
-
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=integer -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=nullability -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=alignment -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// Pass `--no-xcselect` to prevent the driver injecting -fdepfile-entry=<sysroot>/SDKSettings.json when xcselect is active.
-// RUN: %clang --target=%itanium_abi_triple --no-xcselect -fsanitize=float-divide-by-zero -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-// CHECK-DEFAULT-UBSAN-IGNORELIST: -fsanitize-system-ignorelist={{.*}}ubsan_ignorelist.txt
-
-// Check that combining ubsan and another sanitizer results in both ignorelists being used.
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=undefined,address -resource-dir=%S/Inputs/resource_dir %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DEFAULT-UBSAN-IGNORELIST --check-prefix=CHECK-DEFAULT-IGNORELIST-ASAN --implicit-check-not=fdepfile-entry --implicit-check-not=-fsanitize-ignorelist=
-
 // Ignore -fsanitize-ignorelist flag if there is no -fsanitize flag.
 // RUN: %clang --target=x86_64-linux-gnu -fsanitize-ignorelist=%t.good %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-NO-SANITIZE --check-prefix=DELIMITERS
 // CHECK-NO-SANITIZE-NOT: -fsanitize-ignorelist
@@ -63,12 +46,4 @@
 // RUN: %clang --target=x86_64-linux-gnu -fsanitize=address -fno-sanitize-ignorelist %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-DISABLED-SYSTEM --check-prefix=DELIMITERS
 // CHECK-DISABLED-SYSTEM-NOT: -fsanitize-system-ignorelist
 
-// If cfi_ignorelist.txt cannot be found in the resource dir, driver should fail.
-// RUN: not %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=default -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-CFI-IGNORELIST
-// CHECK-MISSING-CFI-IGNORELIST: error: missing sanitizer ignorelist: '{{.*}}cfi_ignorelist.txt'
-
-// -fno-sanitize-ignorelist disables checking for cfi_ignorelist.txt in the resource dir.
-// RUN: %clang --target=x86_64-linux-gnu -fsanitize=cfi -flto -fvisibility=default -fno-sanitize-ignorelist -resource-dir=/dev/null %s -### 2>&1 | FileCheck %s --check-prefix=CHECK-MISSING-CFI-NO-IGNORELIST
-// CHECK-MISSING-CFI-NO-IGNORELIST-NOT: error: no such file or directory: '{{.*}}cfi_ignorelist.txt'
-
 // DELIMITERS: {{^ *"}}
diff --git a/clang/test/Frontend/dependency-gen.c b/clang/test/Frontend/dependency-gen.c
index da3ac4f3adbd6..6d1c6f8e35d30 100644
--- a/clang/test/Frontend/dependency-gen.c
+++ b/clang/test/Frontend/dependency-gen.c
@@ -36,9 +36,10 @@
 // TWO-IGNORE-LISTS-DAG: x.h
 // TWO-IGNORE-LISTS-DAG: dependency-gen.c
 
-// RUN: %clang -MD -MF - %s -fsyntax-only -resource-dir=%S/Inputs/resource_dir_with_sanitizer_ignorelist -fsanitize=undefined -flto -fvisibility=hidden -I ./ | FileCheck -check-prefix=USER-AND-SYS-DEPS %s
-// USER-AND-SYS-DEPS: dependency-gen.o:
-// USER-AND-SYS-DEPS-DAG: ubsan_ignorelist.txt
+// RUN: %clang -MD -MF - %s -fsyntax-only -resource-dir=%S/Inputs/resource_dir_with_sanitizer_ignorelist -fsanitize=undefined -flto -fvisibility=hidden -I ./ | FileCheck %if sanitizer-ignorelists %{ -check-prefix=USER-AND-SYS-DEPS-IGNORELIST %} %else %{ -check-prefix USER-AND-SYS-DEPS-NO-IGNORELIST %} %s
+// USER-AND-SYS-DEPS-IGNORELIST: dependency-gen.o:
+// USER-AND-SYS-DEPS-IGNORELIST-DAG: ubsan_ignorelist.txt
+// USER-AND-SYS-DEPS-NO-IGNORELIST: dependency-gen.o:
 
 // RUN: %clang -MMD -MF - %s -fsyntax-only -resource-dir=%S/Inputs/resource_dir_with_sanitizer_ignorelist -fsanitize=undefined -flto -fvisibility=hidden -I ./ | FileCheck -check-prefix=ONLY-USER-DEPS %s
 // ONLY-USER-DEPS: dependency-gen.o:
diff --git a/clang/test/lit.cfg.py b/clang/test/lit.cfg.py
index 4a00769469543..24b3dfd451571 100644
--- a/clang/test/lit.cfg.py
+++ b/clang/test/lit.cfg.py
@@ -441,6 +441,9 @@ def calculate_arch_features(arch_string):
 if config.use_xcselect:
     config.available_features.add("xcselect")
 
+if config.has_sanitizer_ignorelists:
+    config.available_features.add("sanitizer-ignorelists")
+
 # Tests that rely on chmod to restrict file permissions (e.g. write-permission
 # checks) are unreliable when run as root, since root bypasses file permissions.
 def user_is_root():
diff --git a/clang/test/lit.site.cfg.py.in b/clang/test/lit.site.cfg.py.in
index cb35118167d99..113ac155d8c02 100644
--- a/clang/test/lit.site.cfg.py.in
+++ b/clang/test/lit.site.cfg.py.in
@@ -48,6 +48,7 @@ config.have_llvm_driver = @LLVM_TOOL_LLVM_DRIVER_BUILD@
 config.spirv_tools_tests = @LLVM_INCLUDE_SPIRV_TOOLS_TESTS@
 config.substitutions.append(("%llvm-version-major", "@LLVM_VERSION_MAJOR@"))
 config.use_xcselect = @CLANG_USE_XCSELECT@
+config.has_sanitizer_ignorelists = @CLANG_ENABLE_SANITIZER_SYSTEM_IGNORELISTS@
 
 import lit.llvm
 lit.llvm.initialize(lit_config, config)

``````````

</details>


https://github.com/llvm/llvm-project/pull/195690


More information about the cfe-commits mailing list