[clang] a34e89f - [alpha.webkit.NoDeleteChecker] Don't emit a warning for a function without annotation. (#178824)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 30 19:31:28 PST 2026
Author: Ryosuke Niwa
Date: 2026-01-30T19:31:24-08:00
New Revision: a34e89fcb5f03167cd5ffc8237ccc8cab0314d28
URL: https://github.com/llvm/llvm-project/commit/a34e89fcb5f03167cd5ffc8237ccc8cab0314d28
DIFF: https://github.com/llvm/llvm-project/commit/a34e89fcb5f03167cd5ffc8237ccc8cab0314d28.diff
LOG: [alpha.webkit.NoDeleteChecker] Don't emit a warning for a function without annotation. (#178824)
This PR fixes the bug in alpha.webkit.NoDeleteChecker that it emits a
warning for any function without
[[clang::annotate_type("webkit.nodelete")]] annotation if it contains
non-trivial code. It also fixes a bug hat we weren't checking the
presence of the annotation on superclass' corresponding member
functions.
Added:
Modified:
clang/lib/StaticAnalyzer/Checkers/WebKit/NoDeleteChecker.cpp
clang/test/Analysis/Checkers/WebKit/nodelete-annotation.cpp
Removed:
################################################################################
diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoDeleteChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoDeleteChecker.cpp
index 1edb435919b41..2740890704767 100644
--- a/clang/lib/StaticAnalyzer/Checkers/WebKit/NoDeleteChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/NoDeleteChecker.cpp
@@ -65,39 +65,31 @@ class NoDeleteChecker : public Checker<check::ASTDecl<TranslationUnitDecl>> {
visitor.TraverseDecl(const_cast<TranslationUnitDecl *>(TUD));
}
+ static bool hasNoDeleteAnnotation(const FunctionDecl *FD) {
+ if (llvm::any_of(FD->redecls(), isNoDeleteFunction))
+ return true;
+
+ const auto *MD = dyn_cast<CXXMethodDecl>(FD);
+ if (!MD || !MD->isVirtual())
+ return false;
+
+ auto Overriders = llvm::to_vector(MD->overridden_methods());
+ while (!Overriders.empty()) {
+ const auto *Fn = Overriders.pop_back_val();
+ llvm::append_range(Overriders, Fn->overridden_methods());
+ if (isNoDeleteFunction(Fn))
+ return true;
+ }
+
+ return false;
+ }
+
void visitFunctionDecl(const FunctionDecl *FD) const {
if (!FD->doesThisDeclarationHaveABody())
return;
- bool HasNoDeleteAnnotation = isNoDeleteFunction(FD);
- if (auto *MD = dyn_cast<CXXMethodDecl>(FD)) {
- if (auto *Cls = MD->getParent(); Cls && MD->isVirtual()) {
- CXXBasePaths Paths;
- Paths.setOrigin(Cls);
-
- Cls->lookupInBases(
- [&](const CXXBaseSpecifier *Base, CXXBasePath &) {
- const Type *T = Base->getType().getTypePtrOrNull();
- if (!T)
- return false;
-
- const CXXRecordDecl *R = T->getAsCXXRecordDecl();
- if (!R)
- return false;
-
- for (const CXXMethodDecl *BaseMD : R->methods()) {
- if (BaseMD->getCorrespondingMethodInClass(Cls) == MD) {
- if (isNoDeleteFunction(FD)) {
- HasNoDeleteAnnotation = true;
- return false;
- }
- }
- }
- return true;
- },
- Paths, /*LookupInDependent =*/true);
- }
- }
+ if (!hasNoDeleteAnnotation(FD))
+ return;
auto Body = FD->getBody();
if (!Body || TFA.isTrivial(Body))
diff --git a/clang/test/Analysis/Checkers/WebKit/nodelete-annotation.cpp b/clang/test/Analysis/Checkers/WebKit/nodelete-annotation.cpp
index fc4108e855b66..82667a7916f42 100644
--- a/clang/test/Analysis/Checkers/WebKit/nodelete-annotation.cpp
+++ b/clang/test/Analysis/Checkers/WebKit/nodelete-annotation.cpp
@@ -3,6 +3,10 @@
void someFunction();
void [[clang::annotate_type("webkit.nodelete")]] safeFunction();
+void functionWithoutNoDeleteAnnotation() {
+ someFunction();
+}
+
void [[clang::annotate_type("webkit.nodelete")]] callsUnsafe() {
// expected-warning at -1{{A function 'callsUnsafe' has [[clang::annotate_type("webkit.nodelete")]] but it contains code that could destruct an object}}
someFunction();
More information about the cfe-commits
mailing list