[clang-tools-extra] [clang-tidy][use-internal-linkage]fix false positives for global overloaded operator new and operator delete (PR #117945)
Congcong Cai via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 28 05:32:17 PST 2024
https://github.com/HerrCai0907 updated https://github.com/llvm/llvm-project/pull/117945
>From 7d0f420940240cf8522269fdde3682ff1f5d03e6 Mon Sep 17 00:00:00 2001
From: Congcong Cai <congcongcai0907 at 163.com>
Date: Thu, 28 Nov 2024 08:15:34 +0800
Subject: [PATCH] [clang-tidy][use-internal-linkage]fix false positives for
global overloaded operator new and operator delete
---
.../misc/UseInternalLinkageCheck.cpp | 24 ++++++++++++++++++-
clang-tools-extra/docs/ReleaseNotes.rst | 3 ++-
.../misc/use-internal-linkage-func.cpp | 10 ++++++++
3 files changed, 35 insertions(+), 2 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
index 71eb2d94cd4f26..0f05d16870ffff 100644
--- a/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
+++ b/clang-tools-extra/clang-tidy/misc/UseInternalLinkageCheck.cpp
@@ -15,7 +15,10 @@
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/Specifiers.h"
#include "clang/Lex/Token.h"
+#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/STLExtras.h"
+#include "llvm/ADT/SetVector.h"
+#include "llvm/ADT/SmallVector.h"
using namespace clang::ast_matchers;
@@ -78,6 +81,22 @@ AST_POLYMORPHIC_MATCHER(isExternStorageClass,
return Node.getStorageClass() == SC_Extern;
}
+AST_MATCHER(FunctionDecl, isAllocationOrDeallocationOverloadedFunction) {
+ // [basic.stc.dynamic.allocation]
+ // An allocation function that is not a class member function shall belong to
+ // the global scope and not have a name with internal linkage.
+ // [basic.stc.dynamic.deallocation]
+ // A deallocation function that is not a class member function shall belong to
+ // the global scope and not have a name with internal linkage.
+ static const llvm::DenseSet<OverloadedOperatorKind> OverloadedOperators{
+ OverloadedOperatorKind::OO_New,
+ OverloadedOperatorKind::OO_Array_New,
+ OverloadedOperatorKind::OO_Delete,
+ OverloadedOperatorKind::OO_Array_Delete,
+ };
+ return OverloadedOperators.contains(Node.getOverloadedOperator());
+}
+
} // namespace
UseInternalLinkageCheck::UseInternalLinkageCheck(StringRef Name,
@@ -103,7 +122,10 @@ void UseInternalLinkageCheck::registerMatchers(MatchFinder *Finder) {
// 4. friend
hasAncestor(friendDecl()))));
Finder->addMatcher(
- functionDecl(Common, hasBody(), unless(cxxMethodDecl()), unless(isMain()))
+ functionDecl(Common, hasBody(),
+ unless(anyOf(cxxMethodDecl(),
+ isAllocationOrDeallocationOverloadedFunction(),
+ isMain())))
.bind("fn"),
this);
Finder->addMatcher(varDecl(Common, hasGlobalStorage()).bind("var"), this);
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index f050391110385e..9641d3a0711259 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -237,7 +237,8 @@ Changes in existing checks
- Improved :doc:`misc-use-internal-linkage
<clang-tidy/checks/misc/use-internal-linkage>` check to insert ``static``
keyword before type qualifiers such as ``const`` and ``volatile`` and fix
- false positives for function declaration without body.
+ false positives for function declaration without body and fix false positives
+ for global scoped overloaded ``operator new`` and ``operator delete``.
- Improved :doc:`modernize-avoid-c-arrays
<clang-tidy/checks/modernize/avoid-c-arrays>` check to suggest using
diff --git a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
index bf0d2c2513e562..113868b4cad80f 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/misc/use-internal-linkage-func.cpp
@@ -85,3 +85,13 @@ void func_with_body() {}
void func_without_body();
void func_without_body();
}
+
+// gh117489 start
+namespace std {
+using size_t = unsigned long;
+}
+void * operator new(std::size_t) { return nullptr; }
+void * operator new[](std::size_t) { return nullptr; }
+void operator delete(void*) noexcept {}
+void operator delete[](void*) noexcept {}
+// gh117489 end
More information about the cfe-commits
mailing list