[clang] [Clang][Sema] Process warnings conditionally (PR #120591)

Dmitry Chestnykh via cfe-commits cfe-commits at lists.llvm.org
Mon Dec 23 08:40:16 PST 2024


https://github.com/chestnykh updated https://github.com/llvm/llvm-project/pull/120591

>From 9a0d5d44f70477403a33d2feb3f5518b0d078a66 Mon Sep 17 00:00:00 2001
From: Dmitry Chestnykh <dm.chestnykh at gmail.com>
Date: Thu, 19 Dec 2024 18:35:35 +0300
Subject: [PATCH 1/3] [Clang][Sema] Process warnings conditionally

There are a few functions that emit warnings
related to positional arguments in format strings.
These functions use `getLocationOfByte()` which has O(n)
complexity and may lead to silent hang of compilation in some cases.
But such warnings is not widely used and actually don't emit
if user didn't pass the appropriate `-W...` flag, so
if the flag is not passed dont make the call
to `EmitFormatDiagnostic` for such diags.

Fix #120462
---
 clang/lib/Sema/SemaChecking.cpp | 30 ++++++++++++++++++------------
 1 file changed, 18 insertions(+), 12 deletions(-)

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index e703a62ff9cf18..f5c42eba51c252 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6591,27 +6591,33 @@ void CheckFormatHandler::HandleNonStandardConversionSpecifier(
 
 void CheckFormatHandler::HandlePosition(const char *startPos,
                                         unsigned posLen) {
-  EmitFormatDiagnostic(S.PDiag(diag::warn_format_non_standard_positional_arg),
-                               getLocationOfByte(startPos),
-                               /*IsStringLocation*/true,
-                               getSpecifierRange(startPos, posLen));
+  if (!S.getDiagnostics().isIgnored(diag::warn_format_non_standard_positional_arg, SourceLocation())) {
+    EmitFormatDiagnostic(S.PDiag(diag::warn_format_non_standard_positional_arg),
+                                getLocationOfByte(startPos),
+                                /*IsStringLocation*/true,
+                                getSpecifierRange(startPos, posLen));
+  }
 }
 
 void CheckFormatHandler::HandleInvalidPosition(
     const char *startSpecifier, unsigned specifierLen,
     analyze_format_string::PositionContext p) {
-  EmitFormatDiagnostic(
-      S.PDiag(diag::warn_format_invalid_positional_specifier) << (unsigned)p,
-      getLocationOfByte(startSpecifier), /*IsStringLocation*/ true,
-      getSpecifierRange(startSpecifier, specifierLen));
+  if (!S.getDiagnostics().isIgnored(diag::warn_format_invalid_positional_specifier, SourceLocation())) {
+    EmitFormatDiagnostic(
+        S.PDiag(diag::warn_format_invalid_positional_specifier) << (unsigned)p,
+        getLocationOfByte(startSpecifier), /*IsStringLocation*/ true,
+        getSpecifierRange(startSpecifier, specifierLen));
+  }
 }
 
 void CheckFormatHandler::HandleZeroPosition(const char *startPos,
                                             unsigned posLen) {
-  EmitFormatDiagnostic(S.PDiag(diag::warn_format_zero_positional_specifier),
-                               getLocationOfByte(startPos),
-                               /*IsStringLocation*/true,
-                               getSpecifierRange(startPos, posLen));
+  if (!S.getDiagnostics().isIgnored(diag::warn_format_zero_positional_specifier, SourceLocation())) {
+    EmitFormatDiagnostic(S.PDiag(diag::warn_format_zero_positional_specifier),
+                                getLocationOfByte(startPos),
+                                /*IsStringLocation*/true,
+                                getSpecifierRange(startPos, posLen));
+  }
 }
 
 void CheckFormatHandler::HandleNullChar(const char *nullCharacter) {

>From 7928effc17882139e548adbfe88a52d56f844d3b Mon Sep 17 00:00:00 2001
From: Dmitry Chestnykh <dm.chestnykh at gmail.com>
Date: Thu, 19 Dec 2024 18:50:04 +0300
Subject: [PATCH 2/3] [clang][Sema] Fix code style

---
 clang/lib/Sema/SemaChecking.cpp | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index f5c42eba51c252..9a05181405cde5 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6591,18 +6591,20 @@ void CheckFormatHandler::HandleNonStandardConversionSpecifier(
 
 void CheckFormatHandler::HandlePosition(const char *startPos,
                                         unsigned posLen) {
-  if (!S.getDiagnostics().isIgnored(diag::warn_format_non_standard_positional_arg, SourceLocation())) {
+  if (!S.getDiagnostics().isIgnored(
+          diag::warn_format_non_standard_positional_arg, SourceLocation())) {
     EmitFormatDiagnostic(S.PDiag(diag::warn_format_non_standard_positional_arg),
-                                getLocationOfByte(startPos),
-                                /*IsStringLocation*/true,
-                                getSpecifierRange(startPos, posLen));
+                         getLocationOfByte(startPos),
+                         /*IsStringLocation*/ true,
+                         getSpecifierRange(startPos, posLen));
   }
 }
 
 void CheckFormatHandler::HandleInvalidPosition(
     const char *startSpecifier, unsigned specifierLen,
     analyze_format_string::PositionContext p) {
-  if (!S.getDiagnostics().isIgnored(diag::warn_format_invalid_positional_specifier, SourceLocation())) {
+  if (!S.getDiagnostics().isIgnored(
+          diag::warn_format_invalid_positional_specifier, SourceLocation())) {
     EmitFormatDiagnostic(
         S.PDiag(diag::warn_format_invalid_positional_specifier) << (unsigned)p,
         getLocationOfByte(startSpecifier), /*IsStringLocation*/ true,
@@ -6612,11 +6614,12 @@ void CheckFormatHandler::HandleInvalidPosition(
 
 void CheckFormatHandler::HandleZeroPosition(const char *startPos,
                                             unsigned posLen) {
-  if (!S.getDiagnostics().isIgnored(diag::warn_format_zero_positional_specifier, SourceLocation())) {
+  if (!S.getDiagnostics().isIgnored(diag::warn_format_zero_positional_specifier,
+                                    SourceLocation())) {
     EmitFormatDiagnostic(S.PDiag(diag::warn_format_zero_positional_specifier),
-                                getLocationOfByte(startPos),
-                                /*IsStringLocation*/true,
-                                getSpecifierRange(startPos, posLen));
+                         getLocationOfByte(startPos),
+                         /*IsStringLocation*/ true,
+                         getSpecifierRange(startPos, posLen));
   }
 }
 

>From ca3d8572cac3a1145c2c6a6539dd183f40677d73 Mon Sep 17 00:00:00 2001
From: Dmitry Chestnykh <dm.chestnykh at gmail.com>
Date: Mon, 23 Dec 2024 19:46:03 +0300
Subject: [PATCH 3/3] [Clang][Sema] Remove unneeded braces

---
 clang/lib/Sema/SemaChecking.cpp | 9 +++------
 1 file changed, 3 insertions(+), 6 deletions(-)

diff --git a/clang/lib/Sema/SemaChecking.cpp b/clang/lib/Sema/SemaChecking.cpp
index 9a05181405cde5..ce846ae88c38b4 100644
--- a/clang/lib/Sema/SemaChecking.cpp
+++ b/clang/lib/Sema/SemaChecking.cpp
@@ -6592,35 +6592,32 @@ void CheckFormatHandler::HandleNonStandardConversionSpecifier(
 void CheckFormatHandler::HandlePosition(const char *startPos,
                                         unsigned posLen) {
   if (!S.getDiagnostics().isIgnored(
-          diag::warn_format_non_standard_positional_arg, SourceLocation())) {
+          diag::warn_format_non_standard_positional_arg, SourceLocation()))
     EmitFormatDiagnostic(S.PDiag(diag::warn_format_non_standard_positional_arg),
                          getLocationOfByte(startPos),
                          /*IsStringLocation*/ true,
                          getSpecifierRange(startPos, posLen));
-  }
 }
 
 void CheckFormatHandler::HandleInvalidPosition(
     const char *startSpecifier, unsigned specifierLen,
     analyze_format_string::PositionContext p) {
   if (!S.getDiagnostics().isIgnored(
-          diag::warn_format_invalid_positional_specifier, SourceLocation())) {
+          diag::warn_format_invalid_positional_specifier, SourceLocation()))
     EmitFormatDiagnostic(
         S.PDiag(diag::warn_format_invalid_positional_specifier) << (unsigned)p,
         getLocationOfByte(startSpecifier), /*IsStringLocation*/ true,
         getSpecifierRange(startSpecifier, specifierLen));
-  }
 }
 
 void CheckFormatHandler::HandleZeroPosition(const char *startPos,
                                             unsigned posLen) {
   if (!S.getDiagnostics().isIgnored(diag::warn_format_zero_positional_specifier,
-                                    SourceLocation())) {
+                                    SourceLocation()))
     EmitFormatDiagnostic(S.PDiag(diag::warn_format_zero_positional_specifier),
                          getLocationOfByte(startPos),
                          /*IsStringLocation*/ true,
                          getSpecifierRange(startPos, posLen));
-  }
 }
 
 void CheckFormatHandler::HandleNullChar(const char *nullCharacter) {



More information about the cfe-commits mailing list