[clang] [clang] Emitting a warning if optimizations are enabled with sanitizers (PR #95934)

via cfe-commits cfe-commits at lists.llvm.org
Tue Jun 18 07:30:35 PDT 2024


https://github.com/Ritanya-B-Bharadwaj created https://github.com/llvm/llvm-project/pull/95934

Sanitizers achieve better accuracy with lower optimization levels, and it is generally recommended to use `-O0` (the default optimization level) when using sanitizers for the most accurate results. However, many users might not be aware of this recommendation.

To ensure transparency, we should issue a warning when optimization levels other than `-O0` are enabled alongside sanitizers. This warning will inform users that higher optimization levels can reduce the effectiveness of sanitizers, thereby making them aware of the potential impact on the accuracy of sanitizer.



>From 0174ce4ce17cf7d37a9dcc5ab43fe64296d095fb Mon Sep 17 00:00:00 2001
From: Ritanya B Bharadwaj <ritanya.b.bharadwaj at gmail.com>
Date: Tue, 18 Jun 2024 09:18:27 -0500
Subject: [PATCH] [clang] Emitting a warning if optimizations are enabled with
 sanitizers

---
 clang/include/clang/Basic/DiagnosticDriverKinds.td | 2 ++
 clang/lib/Driver/ToolChains/Clang.cpp              | 6 ++++++
 clang/test/Driver/fsanitize.c                      | 7 +++++++
 3 files changed, 15 insertions(+)

diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td
index 1ca2cb85565a1..bd254bcaf5d97 100644
--- a/clang/include/clang/Basic/DiagnosticDriverKinds.td
+++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td
@@ -477,6 +477,8 @@ def warn_drv_disabling_vptr_no_rtti_default : Warning<
 def warn_drv_object_size_disabled_O0 : Warning<
   "the object size sanitizer has no effect at -O0, but is explicitly enabled: %0">,
   InGroup<InvalidCommandLineArgument>, DefaultWarnNoWerror;
+def warn_sanitizer_with_optimization : Warning<
+  "enabling optimizations with sanitizers may potentially reduce effectiveness">;
 def warn_ignoring_verify_debuginfo_preserve_export : Warning<
   "ignoring -fverify-debuginfo-preserve-export=%0 because "
   "-fverify-debuginfo-preserve wasn't enabled">,
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 331cf6e713d89..2d72b3eb62308 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -6208,6 +6208,12 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
     PScpu::addProfileRTArgs(TC, Args, CmdArgs);
     PScpu::addSanitizerArgs(TC, Args, CmdArgs);
   }
+  
+  // Emit a warning if optimizations are enabled with sanitizers
+  if (Args.hasArg(options::OPT_fsanitize_EQ) &&
+      (Args.hasArg(options::OPT_Ofast) || Args.hasArg(options::OPT_O))) {
+    D.Diag(diag::warn_sanitizer_with_optimization);
+  }
 
   // Pass options for controlling the default header search paths.
   if (Args.hasArg(options::OPT_nostdinc)) {
diff --git a/clang/test/Driver/fsanitize.c b/clang/test/Driver/fsanitize.c
index 08e9c78f9d1d2..5657bb9a6da26 100644
--- a/clang/test/Driver/fsanitize.c
+++ b/clang/test/Driver/fsanitize.c
@@ -1038,3 +1038,10 @@
 // RUN: not %clang --target=aarch64-none-elf -fsanitize=dataflow %s -### 2>&1 | FileCheck %s -check-prefix=UNSUPPORTED-BAREMETAL
 // RUN: not %clang --target=arm-arm-none-eabi -fsanitize=shadow-call-stack %s -### 2>&1 | FileCheck %s -check-prefix=UNSUPPORTED-BAREMETAL
 // UNSUPPORTED-BAREMETAL: unsupported option '-fsanitize={{.*}}' for target
+
+// RUN: %clang -O0 -O1 -fsanitize=address %s -### 2>&1 | FileCheck %s -check-prefix=CHECK-SAN-OPT-WARN
+// RUN: %clang -Ofast -fsanitize=address %s -### 2>&1 | FileCheck %s -check-prefix=CHECK-SAN-OPT-WARN
+// RUN: %clang -O3 -fsanitize=address %s -### 2>&1 | FileCheck %s -check-prefix=CHECK-SAN-OPT-WARN
+// RUN: %clang -O2 -fsanitize=thread %s -### 2>&1 | FileCheck %s -check-prefix=CHECK-SAN-OPT-WARN
+// RUN: %clang -O1 -fsanitize=thread %s -### 2>&1 | FileCheck %s -check-prefix=CHECK-SAN-OPT-WARN
+// CHECK-SAN-OPT-WARN: warning: enabling optimizations with sanitizers may potentially reduce effectiveness



More information about the cfe-commits mailing list