https://github.com/shuvakant6623 updated https://github.com/llvm/llvm-project/pull/199240
>From 284f714d45b57089310002ef8f30c35d3d8c69f5 Mon Sep 17 00:00:00 2001 From: shuvakant6623 <[email protected]> Date: Sat, 23 May 2026 00:42:54 +0530 Subject: [PATCH 1/5] [analyzer] Add option to suppress leak reports for selected ownership types --- .../StaticAnalyzer/Checkers/MallocChecker.cpp | 30 +++++++++++++++++++ clang/test/Analysis/analyzer-config.c | 1 + .../Analysis/suppress-leak-custom-allocator.c | 10 +++++++ 3 files changed, 41 insertions(+) create mode 100644 clang/test/Analysis/suppress-leak-custom-allocator.c diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index a0a8bd4dfc90d..23faf1747d795 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -48,6 +48,7 @@ // //===----------------------------------------------------------------------===// +#include "llvm/ADT/STLExtras.h" #include "AllocationState.h" #include "InterCheckerAPI.h" #include "NoOwnershipChangeVisitor.h" @@ -458,6 +459,9 @@ class MallocChecker StringRef getDebugTag() const override { return "MallocChecker"; } +private: + std::vector<std::string> SuppressLeakTypes; + private: #define CHECK_FN(NAME) \ void NAME(ProgramStateRef State, const CallEvent &Call, CheckerContext &C) \ @@ -3027,6 +3031,16 @@ void MallocChecker::HandleLeak(SymbolRef Sym, ExplodedNode *N, if (Family.Kind == AF_Alloca) return; + // --- BEGIN: Suppress leak reports for selected ownership types --- + if (Family.Kind == AF_Custom && Family.CustomName) { + StringRef Type = *Family.CustomName; + + if (llvm::is_contained(this->SuppressLeakTypes, Type)) { + return; + } + } + // --- END --- + const Leak *Frontend = getRelevantFrontendAs<Leak>(Family); // Note that for leaks we don't add a sink when the relevant frontend is // disabled because the leak is reported with a non-fatal error node, while @@ -4197,6 +4211,22 @@ void ento::registerInnerPointerCheckerAux(CheckerManager &Mgr) { void ento::registerDynamicMemoryModeling(CheckerManager &Mgr) { auto *Chk = Mgr.getChecker<MallocChecker>(); + auto ChkName = Mgr.getCurrentCheckerName(); + + StringRef SuppressList = + Mgr.getAnalyzerOptions().getCheckerStringOption( + ChkName, "SuppressLeakReportsFor"); + + SmallVector<StringRef, 8> Split; + SuppressList.split(Split, ',', -1, false); + + for (StringRef S : Split) { + S = S.trim(); + if (S.empty()) + continue; + Chk->SuppressLeakTypes.push_back(S.str()); + } + // FIXME: This is a "hidden" undocumented frontend but there are public // checker options which are attached to it. CheckerNameRef DMMName = Mgr.getCurrentCheckerName(); diff --git a/clang/test/Analysis/analyzer-config.c b/clang/test/Analysis/analyzer-config.c index 04dc8c24421bc..972f3ecc8089a 100644 --- a/clang/test/Analysis/analyzer-config.c +++ b/clang/test/Analysis/analyzer-config.c @@ -136,6 +136,7 @@ // CHECK-NEXT: track-conditions-debug = false // CHECK-NEXT: unix.DynamicMemoryModeling:AddNoOwnershipChangeNotes = true // CHECK-NEXT: unix.DynamicMemoryModeling:Optimistic = false +// CHECK-NEXT: unix.DynamicMemoryModeling:SuppressLeakReportsFor = "" // CHECK-NEXT: unix.Errno:AllowErrnoReadOutsideConditionExpressions = true // CHECK-NEXT: unix.StdCLibraryFunctions:DisplayLoadedSummaries = false // CHECK-NEXT: unix.StdCLibraryFunctions:ModelPOSIX = true diff --git a/clang/test/Analysis/suppress-leak-custom-allocator.c b/clang/test/Analysis/suppress-leak-custom-allocator.c new file mode 100644 index 0000000000000..45ac9b7aee336 --- /dev/null +++ b/clang/test/Analysis/suppress-leak-custom-allocator.c @@ -0,0 +1,10 @@ +// RUN: %clang_analyze_cc1 -analyzer-checker=unix.Malloc,unix.DynamicMemoryModeling \ +// RUN: -analyzer-config unix.DynamicMemoryModeling:SuppressLeakReportsFor=arena \ +// RUN: %s -verify + +void *arena_alloc(void) __attribute__((ownership_returns(arena))); + +void test() { + void *p = arena_alloc(); + // expected-no-diagnostics +} \ No newline at end of file >From 70bef36f308a106b027d2340c831d46c60551656 Mon Sep 17 00:00:00 2001 From: shuvakant6623 <[email protected]> Date: Sat, 23 May 2026 00:44:01 +0530 Subject: [PATCH 2/5] [analyzer] updated Checkers.td --- clang/include/clang/StaticAnalyzer/Checkers/Checkers.td | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td index 6b9e0b50e1f59..cac465d69eac5 100644 --- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td +++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td @@ -512,7 +512,12 @@ def DynamicMemoryModeling: Checker<"DynamicMemoryModeling">, "NoStoreFuncVisitor.", "true", Released, - Hide> + Hide>, + CmdLineOption<String, + "SuppressLeakReportsFor", + "Comma-separated list of ownership types for which leak reports should be suppressed", + "", + InAlpha> ]>, Dependencies<[CStringModeling]>, Documentation<NotDocumented>, >From ea7e716c3eceb3ed22c30a016f8565a2d00e1e1e Mon Sep 17 00:00:00 2001 From: shuvakant6623 <[email protected]> Date: Sat, 23 May 2026 00:48:29 +0530 Subject: [PATCH 3/5] [analyzer] Add option to suppress leak reports for selected ownership types --- clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 23faf1747d795..d182a4eea3b9e 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -3029,7 +3029,11 @@ void MallocChecker::HandleLeak(SymbolRef Sym, ExplodedNode *N, AllocationFamily Family = RS->getAllocationFamily(); if (Family.Kind == AF_Alloca) +<<<<<<< HEAD return; +======= + return; +>>>>>>> 85c273dfcf50 ([analyzer] Address review feedback) // --- BEGIN: Suppress leak reports for selected ownership types --- if (Family.Kind == AF_Custom && Family.CustomName) { >From 1bf3a2304ed65a3e70538a8d6b561ce2a5c7675c Mon Sep 17 00:00:00 2001 From: shuvakant6623 <[email protected]> Date: Sat, 23 May 2026 00:54:31 +0530 Subject: [PATCH 4/5] [analyzer] MallocChecker fixes --- clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index d182a4eea3b9e..23faf1747d795 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -3029,11 +3029,7 @@ void MallocChecker::HandleLeak(SymbolRef Sym, ExplodedNode *N, AllocationFamily Family = RS->getAllocationFamily(); if (Family.Kind == AF_Alloca) -<<<<<<< HEAD return; -======= - return; ->>>>>>> 85c273dfcf50 ([analyzer] Address review feedback) // --- BEGIN: Suppress leak reports for selected ownership types --- if (Family.Kind == AF_Custom && Family.CustomName) { >From 5808dab361a103e57972de9d94a842afe45956e3 Mon Sep 17 00:00:00 2001 From: shuvakant6623 <[email protected]> Date: Wed, 27 May 2026 01:01:06 +0530 Subject: [PATCH 5/5] [analyzer] Add SuppressLeakReportsFor option and fix review comments in MallocChecker --- .../clang/StaticAnalyzer/Checkers/Checkers.td | 3 +- .../StaticAnalyzer/Checkers/MallocChecker.cpp | 31 ++++++------------- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td index cac465d69eac5..31a80efe4fd90 100644 --- a/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td +++ b/clang/include/clang/StaticAnalyzer/Checkers/Checkers.td @@ -515,7 +515,8 @@ def DynamicMemoryModeling: Checker<"DynamicMemoryModeling">, Hide>, CmdLineOption<String, "SuppressLeakReportsFor", - "Comma-separated list of ownership types for which leak reports should be suppressed", + "Comma-separated list of ownership types for which " + "leak reports should be suppressed", "", InAlpha> ]>, diff --git a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp index 23faf1747d795..cb624b12935a6 100644 --- a/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MallocChecker.cpp @@ -401,7 +401,8 @@ class MallocChecker bool ShouldIncludeOwnershipAnnotatedFunctions = false; bool ShouldRegisterNoOwnershipChangeVisitor = false; - + std::vector<std::string> SuppressLeakTypes; + // This checker family implements many bug types and frontends, and several // bug types are shared between multiple frontends, so most of the frontends // are declared with the helper class DynMemFrontend. @@ -459,9 +460,6 @@ class MallocChecker StringRef getDebugTag() const override { return "MallocChecker"; } -private: - std::vector<std::string> SuppressLeakTypes; - private: #define CHECK_FN(NAME) \ void NAME(ProgramStateRef State, const CallEvent &Call, CheckerContext &C) \ @@ -3031,15 +3029,9 @@ void MallocChecker::HandleLeak(SymbolRef Sym, ExplodedNode *N, if (Family.Kind == AF_Alloca) return; - // --- BEGIN: Suppress leak reports for selected ownership types --- - if (Family.Kind == AF_Custom && Family.CustomName) { - StringRef Type = *Family.CustomName; - - if (llvm::is_contained(this->SuppressLeakTypes, Type)) { + if (Family.Kind == AF_Custom && Family.CustomName && llvm::is_contained(SuppressLeakTypes, *Family.CustomName) { return; - } } - // --- END --- const Leak *Frontend = getRelevantFrontendAs<Leak>(Family); // Note that for leaks we don't add a sink when the relevant frontend is @@ -4211,25 +4203,22 @@ void ento::registerInnerPointerCheckerAux(CheckerManager &Mgr) { void ento::registerDynamicMemoryModeling(CheckerManager &Mgr) { auto *Chk = Mgr.getChecker<MallocChecker>(); - auto ChkName = Mgr.getCurrentCheckerName(); + // FIXME: This is a "hidden" undocumented frontend but there are public + // checker options which are attached to it. + CheckerNameRef DMMName = Mgr.getCurrentCheckerName(); StringRef SuppressList = Mgr.getAnalyzerOptions().getCheckerStringOption( - ChkName, "SuppressLeakReportsFor"); + DMMName, "SuppressLeakReportsFor"); SmallVector<StringRef, 8> Split; - SuppressList.split(Split, ',', -1, false); + SuppressList.split(Split, ','); for (StringRef S : Split) { S = S.trim(); - if (S.empty()) - continue; - Chk->SuppressLeakTypes.push_back(S.str()); + if (!S.empty()) + Chk->SuppressLeakTypes.push_back(S.str()); } - - // FIXME: This is a "hidden" undocumented frontend but there are public - // checker options which are attached to it. - CheckerNameRef DMMName = Mgr.getCurrentCheckerName(); Chk->ShouldIncludeOwnershipAnnotatedFunctions = Mgr.getAnalyzerOptions().getCheckerBooleanOption(DMMName, "Optimistic"); Chk->ShouldRegisterNoOwnershipChangeVisitor = _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
