https://github.com/rniwa created https://github.com/llvm/llvm-project/pull/132497
This PR adds the support for WTF::NoVirtualDestructorBase, which signifies to the checker that the class is exempt from having a virtual destructor. >From a49c213d2ccb82391eb6e550d440ef4e829ecfa8 Mon Sep 17 00:00:00 2001 From: Ryosuke Niwa <rn...@webkit.org> Date: Fri, 21 Mar 2025 18:13:35 -0700 Subject: [PATCH] [webkit.RefCntblBaseVirtualDtor] Add support for NoVirtualDestructorBase. This PR adds the support for WTF::NoVirtualDestructorBase, which signifies to the checker that the class is exempt from having a virtual destructor. --- .../WebKit/RefCntblBaseVirtualDtorChecker.cpp | 10 +++++++++- .../WebKit/ref-cntbl-base-virtual-dtor.cpp | 17 +++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp index 77520f1f731c1..98c587d62978b 100644 --- a/clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/WebKit/RefCntblBaseVirtualDtorChecker.cpp @@ -202,6 +202,13 @@ class RefCntblBaseVirtualDtorChecker if (!C) continue; + bool isExempt = T.getAsString() == "NoVirtualDestructorBase" && + safeGetName(C->getParent()) == "WTF"; + if (isExempt || ExemptDecls.contains(C)) { + ExemptDecls.insert(RD); + continue; + } + if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(C)) { for (auto &Arg : CTSD->getTemplateArgs().asArray()) { if (Arg.getKind() != TemplateArgument::Type) @@ -223,12 +230,13 @@ class RefCntblBaseVirtualDtorChecker llvm::SetVector<const CXXRecordDecl *> Decls; llvm::DenseSet<const CXXRecordDecl *> CRTPs; + llvm::DenseSet<const CXXRecordDecl *> ExemptDecls; }; LocalVisitor visitor(this); visitor.TraverseDecl(const_cast<TranslationUnitDecl *>(TUD)); for (auto *RD : visitor.Decls) { - if (visitor.CRTPs.contains(RD)) + if (visitor.CRTPs.contains(RD) || visitor.ExemptDecls.contains(RD)) continue; visitCXXRecordDecl(RD); } diff --git a/clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor.cpp b/clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor.cpp index 5cf7e7614d06e..fd4144d572e01 100644 --- a/clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor.cpp +++ b/clang/test/Analysis/Checkers/WebKit/ref-cntbl-base-virtual-dtor.cpp @@ -1,5 +1,13 @@ // RUN: %clang_analyze_cc1 -analyzer-checker=webkit.RefCntblBaseVirtualDtor -verify %s +namespace WTF { + +class NoVirtualDestructorBase { }; + +}; + +using WTF::NoVirtualDestructorBase; + struct RefCntblBase { void ref() {} void deref() {} @@ -19,6 +27,15 @@ struct [[clang::suppress]] SuppressedDerivedWithVirtualDtor : RefCntblBase { virtual ~SuppressedDerivedWithVirtualDtor() {} }; +class ClassWithoutVirtualDestructor : public NoVirtualDestructorBase { +public: + void ref() const; + void deref() const; +}; + +class DerivedClassWithoutVirtualDestructor : public ClassWithoutVirtualDestructor { +}; + // FIXME: Support attributes on base specifiers? Currently clang // doesn't support such attributes at all, even though it knows // how to parse them. _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits