[clang] 612e7ca - [SSAF][NFC] Rename operator new/delete pointers analysis to TypeConstrainedPointers (#208577)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 13 13:51:53 PDT 2026
Author: Ziqing Luo
Date: 2026-07-13T13:51:48-07:00
New Revision: 612e7ca85c53e85a7444bfc23e763a756a50f69a
URL: https://github.com/llvm/llvm-project/commit/612e7ca85c53e85a7444bfc23e763a756a50f69a
DIFF: https://github.com/llvm/llvm-project/commit/612e7ca85c53e85a7444bfc23e763a756a50f69a.diff
LOG: [SSAF][NFC] Rename operator new/delete pointers analysis to TypeConstrainedPointers (#208577)
There will be more such pointer entities that must retain their type
during the clang-reforge transformation. Since they are extracted and
processed similarly, combining them into a single analysis simplifies
maintenance. Therefore, we are using TypeConstrainedPointers as the
umbrella name.
Added:
clang/include/clang/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.h
clang/lib/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.cpp
clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-bad-id.json
clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-no-key.json
clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary.json
clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-bad-id.json
clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-empty.json
clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-no-key.json
clang/test/Analysis/Scalable/TypeConstrainedPointers/tu-summary-serialization.test
clang/test/Analysis/Scalable/TypeConstrainedPointers/type-constrained-pointers.cpp
clang/test/Analysis/Scalable/TypeConstrainedPointers/wpa-result-serialization.test
clang/unittests/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointersExtractorTest.cpp
Modified:
clang/include/clang/ScalableStaticAnalysis/BuiltinAnchorSources.def
clang/lib/ScalableStaticAnalysis/Analyses/CMakeLists.txt
clang/unittests/ScalableStaticAnalysis/CMakeLists.txt
Removed:
clang/include/clang/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.h
clang/lib/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.cpp
clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-bad-id.json
clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-no-key.json
clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary.json
clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-bad-id.json
clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-empty.json
clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-no-key.json
clang/test/Analysis/Scalable/OperatorNewDelete/operator-new-delete.cpp
clang/test/Analysis/Scalable/OperatorNewDelete/tu-summary-serialization.test
clang/test/Analysis/Scalable/OperatorNewDelete/wpa-result-serialization.test
clang/unittests/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointersExtractorTest.cpp
################################################################################
diff --git a/clang/include/clang/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.h b/clang/include/clang/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.h
deleted file mode 100644
index f3524aa329673..0000000000000
--- a/clang/include/clang/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.h
+++ /dev/null
@@ -1,79 +0,0 @@
-//===- OperatorNewDeletePointers.h ------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// Declares data structures for analysis that identifies pointer entities in
-// operator new/delete overloads that must have a 'void*' type
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_SCALABLESTATICANALYSIS_ANALYSES_OPERATORNEWDELETE_OPERATORNEWDELETEPOINTERS_H
-#define LLVM_CLANG_SCALABLESTATICANALYSIS_ANALYSES_OPERATORNEWDELETE_OPERATORNEWDELETEPOINTERS_H
-
-#include "clang/ScalableStaticAnalysis/Core/Model/EntityId.h"
-#include "clang/ScalableStaticAnalysis/Core/Model/SummaryName.h"
-#include "clang/ScalableStaticAnalysis/Core/TUSummary/EntitySummary.h"
-#include "clang/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisName.h"
-#include "clang/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisResult.h"
-#include "llvm/ADT/StringRef.h"
-#include <set>
-
-namespace clang::ssaf {
-
-/// \brief Collects specific pointer entities related to operator new and delete
-/// overloads within a contributor.
-///
-/// OperatorNewDeletePointersEntitySummary collects the following entities:
-/// -# The returned entities of `operator new` overloads.
-/// -# The parameter (optionally the second) of `operator new` overloads
-/// representing the pointer to a memory area at which to initialize the
-/// object.
-/// -# The first parameter of `operator delete` overloads representing the
-/// pointer
-/// to a memory block to deallocate (or a null pointer).
-/// -# The parameter (optionally the second) of `operator delete` overloads
-/// representing the pointer used as the placement parameter in the matching
-/// placement `new`.
-struct OperatorNewDeletePointersEntitySummary final : public EntitySummary {
- static constexpr llvm::StringLiteral Name = "OperatorNewDeletePointers";
-
- static SummaryName summaryName() { return SummaryName(Name.str()); }
-
- SummaryName getSummaryName() const override { return summaryName(); }
-
- bool friend operator==(const OperatorNewDeletePointersEntitySummary &This,
- const OperatorNewDeletePointersEntitySummary &Other) {
- return This.Entities == Other.Entities;
- }
-
- bool operator==(const std::set<EntityId> &OtherEntities) const {
- return Entities == OtherEntities;
- }
-
- bool empty() const { return Entities.empty(); }
-
- std::set<EntityId> Entities;
-};
-
-/// \brief Whole-program result of the operator new/delete pointer
-/// analysis.
-struct OperatorNewDeletePointersAnalysisResult final : AnalysisResult {
- static constexpr llvm::StringLiteral Name =
- "OperatorNewDeletePointersAnalysisResult";
-
- static AnalysisName analysisName() { return AnalysisName(Name.str()); }
-
- std::set<EntityId> Entities;
-
- bool contains(const EntityId &Id) const {
- return Entities.find(Id) != Entities.end();
- }
-};
-
-} // namespace clang::ssaf
-
-#endif // LLVM_CLANG_SCALABLESTATICANALYSIS_ANALYSES_OPERATORNEWDELETE_OPERATORNEWDELETEPOINTERS_H
diff --git a/clang/include/clang/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.h b/clang/include/clang/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.h
new file mode 100644
index 0000000000000..e785782c001fa
--- /dev/null
+++ b/clang/include/clang/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.h
@@ -0,0 +1,75 @@
+//===- TypeConstrainedPointers.h --------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// Declares data structures for the Type Constrained Pointers analysis, which
+// identifies pointer entities that must retain their pointer type throughout
+// the program.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_SCALABLESTATICANALYSIS_ANALYSES_TYPECONSTRAINEDPOINTERS_TYPECONSTRAINEDPOINTERS_H
+#define LLVM_CLANG_SCALABLESTATICANALYSIS_ANALYSES_TYPECONSTRAINEDPOINTERS_TYPECONSTRAINEDPOINTERS_H
+
+#include "clang/ScalableStaticAnalysis/Core/Model/EntityId.h"
+#include "clang/ScalableStaticAnalysis/Core/Model/SummaryName.h"
+#include "clang/ScalableStaticAnalysis/Core/TUSummary/EntitySummary.h"
+#include "clang/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisName.h"
+#include "clang/ScalableStaticAnalysis/Core/WholeProgramAnalysis/AnalysisResult.h"
+#include "llvm/ADT/StringRef.h"
+#include <set>
+
+namespace clang::ssaf {
+
+/// Per-contributor set of pointer entities that must retain their pointer type.
+///
+/// From `operator new` / `operator delete` overloads:
+/// -# The return entity of `operator new` overloads.
+/// -# The second parameter of `operator new(size_t, void*)` representing the
+/// pointer to the memory area at which to initialize the object.
+/// -# The first parameter of `operator delete` overloads representing the
+/// pointer to the memory block to deallocate (or a null pointer).
+/// -# The second parameter of `operator delete(void*, void*)` representing
+/// the placement pointer matching the corresponding placement `new`.
+struct TypeConstrainedPointersEntitySummary final : public EntitySummary {
+ static constexpr llvm::StringLiteral Name = "TypeConstrainedPointers";
+
+ static SummaryName summaryName() { return SummaryName(Name.str()); }
+
+ SummaryName getSummaryName() const override { return summaryName(); }
+
+ bool friend operator==(const TypeConstrainedPointersEntitySummary &This,
+ const TypeConstrainedPointersEntitySummary &Other) {
+ return This.Entities == Other.Entities;
+ }
+
+ bool operator==(const std::set<EntityId> &OtherEntities) const {
+ return Entities == OtherEntities;
+ }
+
+ bool empty() const { return Entities.empty(); }
+
+ std::set<EntityId> Entities;
+};
+
+/// Whole-program set of pointer entities that must retain their pointer type.
+struct TypeConstrainedPointersAnalysisResult final : AnalysisResult {
+ static constexpr llvm::StringLiteral Name =
+ "TypeConstrainedPointersAnalysisResult";
+
+ static AnalysisName analysisName() { return AnalysisName(Name.str()); }
+
+ std::set<EntityId> Entities;
+
+ bool contains(const EntityId &Id) const {
+ return Entities.find(Id) != Entities.end();
+ }
+};
+
+} // namespace clang::ssaf
+
+#endif // LLVM_CLANG_SCALABLESTATICANALYSIS_ANALYSES_TYPECONSTRAINEDPOINTERS_TYPECONSTRAINEDPOINTERS_H
diff --git a/clang/include/clang/ScalableStaticAnalysis/BuiltinAnchorSources.def b/clang/include/clang/ScalableStaticAnalysis/BuiltinAnchorSources.def
index 186710f3ea00a..1afecd10bea78 100644
--- a/clang/include/clang/ScalableStaticAnalysis/BuiltinAnchorSources.def
+++ b/clang/include/clang/ScalableStaticAnalysis/BuiltinAnchorSources.def
@@ -20,7 +20,7 @@ ANCHOR(AnalysisRegistryAnchorSource)
ANCHOR(CallGraphExtractorAnchorSource)
ANCHOR(CallGraphJSONFormatAnchorSource)
ANCHOR(JSONFormatAnchorSource)
-ANCHOR(OperatorNewDeletePointersAnchorSource)
+ANCHOR(TypeConstrainedPointersAnchorSource)
ANCHOR(PointerFlowAnalysisAnchorSource)
ANCHOR(PointerFlowExtractorAnchorSource)
ANCHOR(PointerFlowJSONFormatAnchorSource)
diff --git a/clang/lib/ScalableStaticAnalysis/Analyses/CMakeLists.txt b/clang/lib/ScalableStaticAnalysis/Analyses/CMakeLists.txt
index caa4286b9f271..56b88a53e6665 100644
--- a/clang/lib/ScalableStaticAnalysis/Analyses/CMakeLists.txt
+++ b/clang/lib/ScalableStaticAnalysis/Analyses/CMakeLists.txt
@@ -8,12 +8,12 @@ add_clang_library(clangScalableStaticAnalysisAnalyses
CallGraph/CallGraphJSONFormat.cpp
EntityPointerLevel/EntityPointerLevel.cpp
EntityPointerLevel/EntityPointerLevelFormat.cpp
- OperatorNewDelete/OperatorNewDeletePointers.cpp
PointerFlow/PointerFlow.cpp
PointerFlow/PointerFlowAnalysis.cpp
PointerFlow/PointerFlowExtractor.cpp
PointerFlow/PointerFlowFormat.cpp
SSAFAnalysesCommon.cpp
+ TypeConstrainedPointers/TypeConstrainedPointers.cpp
UnsafeBufferUsage/UnsafeBufferUsage.cpp
UnsafeBufferUsage/UnsafeBufferUsageAnalysis.cpp
UnsafeBufferUsage/UnsafeBufferUsageExtractor.cpp
diff --git a/clang/lib/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.cpp b/clang/lib/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.cpp
similarity index 63%
rename from clang/lib/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.cpp
rename to clang/lib/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.cpp
index 044faf60cfcb2..21bd75055e034 100644
--- a/clang/lib/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.cpp
+++ b/clang/lib/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.cpp
@@ -1,4 +1,4 @@
-//===- OperatorNewDeletePointers.cpp --------------------------------------===//
+//===- TypeConstrainedPointers.cpp ----------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -6,27 +6,19 @@
//
//===----------------------------------------------------------------------===//
//
-// Implementation of the OperatorNewDeletePointers analysis, including
+// Implementation of the Type Constrained Pointers analysis, including
//
-// a) the Extractor implementation for extracting from user-provided operator
-// new/delete overloadings:
-// 1 return entities of operator new overloads;
-// 2 the parameter (optionally the 2nd) of operator new overloads
-// representing the pointer to a memory area to initialize the object at;
-// 3 the first parameter of operator delete overloads representing the
-// pointer to a memory block to deallocate or a null pointer;
-// 4 the parameter (optionally the 2nd) of operator delete overloads
-// representing the pointer used as the placement parameter in the matching
-// placement new.
+// a) the Extractor implementation collecting pointer entities that shall retain
+// their types
//
// b) the WPA implementation that simply groups extracted summaries into a
-// OperatorNewDeletePointersAnalysisResult that other analysis can use.
+// TypeConstrainedPointersAnalysisResult that other analysis can use.
//
// c) serialization implementations
//
//===----------------------------------------------------------------------===//
-#include "clang/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.h"
+#include "clang/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.h"
#include "../SSAFAnalysesCommon.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Decl.h"
@@ -53,31 +45,40 @@ using namespace ssaf;
namespace {
-class OperatorNewDeletePointersExtractor final : public TUSummaryExtractor {
+// Extracts pointer entities that must retain their pointer type.
+//
+// From `operator new` / `operator delete` overloads:
+// 1 the return entity of `operator new` overloads;
+// 2 the second parameter of `operator new(size_t, void*)` representing the
+// pointer to the memory area at which to initialize the object;
+// 3 the first parameter of `operator delete` overloads representing the
+// pointer to the memory block to deallocate (or a null pointer);
+// 4 the second parameter of `operator delete(void*, void*)` representing
+// the placement pointer matching the corresponding placement `new`.
+class TypeConstrainedPointersExtractor final : public TUSummaryExtractor {
public:
using TUSummaryExtractor::TUSummaryExtractor;
private:
void HandleTranslationUnit(ASTContext &Ctx) override;
- std::unique_ptr<OperatorNewDeletePointersEntitySummary>
+ std::unique_ptr<TypeConstrainedPointersEntitySummary>
extractEntitySummary(const std::vector<const NamedDecl *> &Decls);
};
-void OperatorNewDeletePointersExtractor::HandleTranslationUnit(
- ASTContext &Ctx) {
+void TypeConstrainedPointersExtractor::HandleTranslationUnit(ASTContext &Ctx) {
extractAndAddSummaries(
*this, SummaryBuilder, Ctx,
[&](const std::vector<const NamedDecl *> &Decls) {
return extractEntitySummary(Decls);
},
- OperatorNewDeletePointersEntitySummary::Name);
+ TypeConstrainedPointersEntitySummary::Name);
}
-std::unique_ptr<OperatorNewDeletePointersEntitySummary>
-OperatorNewDeletePointersExtractor::extractEntitySummary(
+std::unique_ptr<TypeConstrainedPointersEntitySummary>
+TypeConstrainedPointersExtractor::extractEntitySummary(
const std::vector<const NamedDecl *> &ContributorDecls) {
- auto Summary = std::make_unique<OperatorNewDeletePointersEntitySummary>();
+ auto Summary = std::make_unique<TypeConstrainedPointersEntitySummary>();
auto Matcher = [&Summary, this](const DynTypedNode &Node) {
const auto *FD = Node.get<FunctionDecl>();
@@ -122,23 +123,22 @@ OperatorNewDeletePointersExtractor::extractEntitySummary(
//===----------------------------------------------------------------------===//
// WPA implementation
//===----------------------------------------------------------------------===//
-class OperatorNewDeletePointersAnalysis final
- : public SummaryAnalysis<OperatorNewDeletePointersAnalysisResult,
- OperatorNewDeletePointersEntitySummary> {
+class TypeConstrainedPointersAnalysis final
+ : public SummaryAnalysis<TypeConstrainedPointersAnalysisResult,
+ TypeConstrainedPointersEntitySummary> {
public:
llvm::Error
- add(EntityId,
- const OperatorNewDeletePointersEntitySummary &Summary) override {
+ add(EntityId, const TypeConstrainedPointersEntitySummary &Summary) override {
getResult().Entities.insert(Summary.Entities.begin(),
Summary.Entities.end());
return llvm::Error::success();
}
};
-AnalysisRegistry::Add<OperatorNewDeletePointersAnalysis>
- RegisterOperatorNewDeletePointersAnalysis(
- "Whole-program set of pointer entities in operator new/delete "
- "overloads that must retain their 'void*' type");
+AnalysisRegistry::Add<TypeConstrainedPointersAnalysis>
+ RegisterTypeConstrainedPointersAnalysis(
+ "Whole-program set of pointer entities that "
+ "must retain their pointer type");
//===----------------------------------------------------------------------===//
// serialization implementation
@@ -152,7 +152,7 @@ llvm::json::Object serializeImpl(const std::set<EntityId> &Set,
DataArray.reserve(Set.size());
for (const auto &Ent : Set)
DataArray.push_back(Fn(Ent));
- Result[OperatorNewDeletePointersAnalysisResult::Name] = std::move(DataArray);
+ Result[TypeConstrainedPointersAnalysisResult::Name] = std::move(DataArray);
return Result;
}
@@ -160,13 +160,13 @@ llvm::Expected<std::set<EntityId>>
deserializeImpl(const llvm::json::Object &Data,
JSONFormat::EntityIdFromJSONFn Fn) {
const auto *DataArray =
- Data.getArray(OperatorNewDeletePointersAnalysisResult::Name);
+ Data.getArray(TypeConstrainedPointersAnalysisResult::Name);
std::set<EntityId> EntitySet;
if (!DataArray) {
return makeSawButExpectedError(
Data, "An object with a key %s",
- OperatorNewDeletePointersAnalysisResult::Name.data());
+ TypeConstrainedPointersAnalysisResult::Name.data());
}
for (const auto &Elt : *DataArray) {
const auto *EltAsObj = Elt.getAsObject();
@@ -186,8 +186,7 @@ deserializeImpl(const llvm::json::Object &Data,
llvm::json::Object serializeSummary(const EntitySummary &S,
JSONFormat::EntityIdToJSONFn Fn) {
- const auto &SS =
- static_cast<const OperatorNewDeletePointersEntitySummary &>(S);
+ const auto &SS = static_cast<const TypeConstrainedPointersEntitySummary &>(S);
return serializeImpl(SS.Entities, Fn);
}
@@ -199,28 +198,28 @@ deserializeSummary(const llvm::json::Object &Data, EntityIdTable &,
if (!EntityIDSet)
return EntityIDSet.takeError();
- std::unique_ptr<OperatorNewDeletePointersEntitySummary> Sum =
- std::make_unique<OperatorNewDeletePointersEntitySummary>();
+ std::unique_ptr<TypeConstrainedPointersEntitySummary> Sum =
+ std::make_unique<TypeConstrainedPointersEntitySummary>();
Sum->Entities = std::move(*EntityIDSet);
return Sum;
}
-struct OperatorNewDeletePointersJSONFormatInfo final : JSONFormat::FormatInfo {
- OperatorNewDeletePointersJSONFormatInfo()
+struct TypeConstrainedPointersJSONFormatInfo final : JSONFormat::FormatInfo {
+ TypeConstrainedPointersJSONFormatInfo()
: JSONFormat::FormatInfo(
- OperatorNewDeletePointersEntitySummary::summaryName(),
+ TypeConstrainedPointersEntitySummary::summaryName(),
serializeSummary, deserializeSummary) {}
};
static llvm::Registry<JSONFormat::FormatInfo>::Add<
- OperatorNewDeletePointersJSONFormatInfo>
- RegisterOperatorNewDeletePointersJSONFormatInfo(
- OperatorNewDeletePointersEntitySummary::Name,
- "JSON Format info for OperatorNewDeletePointersEntitySummary");
+ TypeConstrainedPointersJSONFormatInfo>
+ RegisterTypeConstrainedPointersJSONFormatInfo(
+ TypeConstrainedPointersEntitySummary::Name,
+ "JSON Format info for TypeConstrainedPointersEntitySummary");
llvm::json::Object
-serializeAnalysisResult(const OperatorNewDeletePointersAnalysisResult &R,
+serializeAnalysisResult(const TypeConstrainedPointersAnalysisResult &R,
JSONFormat::EntityIdToJSONFn Fn) {
return serializeImpl(R.Entities, Fn);
}
@@ -233,26 +232,25 @@ deserializeAnalysisResult(const llvm::json::Object &Data,
if (!EntityIDSet)
return EntityIDSet.takeError();
- std::unique_ptr<OperatorNewDeletePointersAnalysisResult> AR =
- std::make_unique<OperatorNewDeletePointersAnalysisResult>();
+ std::unique_ptr<TypeConstrainedPointersAnalysisResult> AR =
+ std::make_unique<TypeConstrainedPointersAnalysisResult>();
AR->Entities = std::move(*EntityIDSet);
return AR;
}
-JSONFormat::AnalysisResultRegistry::Add<OperatorNewDeletePointersAnalysisResult>
- RegisterNewDeletePointersAnalysisResultForJSON(serializeAnalysisResult,
- deserializeAnalysisResult);
+JSONFormat::AnalysisResultRegistry::Add<TypeConstrainedPointersAnalysisResult>
+ RegisterTypeConstrainedPointersAnalysisResultForJSON(
+ serializeAnalysisResult, deserializeAnalysisResult);
} // namespace
namespace clang::ssaf {
// NOLINTNEXTLINE(misc-use-internal-linkage)
-volatile int OperatorNewDeletePointersAnchorSource = 0;
+volatile int TypeConstrainedPointersAnchorSource = 0;
} // namespace clang::ssaf
-static TUSummaryExtractorRegistry::Add<OperatorNewDeletePointersExtractor>
- RegisterOperatorNewDeletePointersExtractor(
- OperatorNewDeletePointersEntitySummary::Name,
- "Extract pointer entities in operator new/delete overloads that must "
- "have a 'void*' type");
+static TUSummaryExtractorRegistry::Add<TypeConstrainedPointersExtractor>
+ RegisterTypeConstrainedPointersExtractor(
+ TypeConstrainedPointersEntitySummary::Name,
+ "Extract pointer entities that must retain their pointer type");
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-empty.json b/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-empty.json
deleted file mode 100644
index 2aee489c6b429..0000000000000
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-empty.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
- "id_table": [],
- "results": [
- {
- "analysis_name": "OperatorNewDeletePointersAnalysisResult",
- "result": {
- "OperatorNewDeletePointersAnalysisResult": []
- }
- }
- ],
- "type": "WPASuite"
-}
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-bad-id.json b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-bad-id.json
similarity index 84%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-bad-id.json
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-bad-id.json
index e51268fdd7652..286826682b050 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-bad-id.json
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-bad-id.json
@@ -5,13 +5,13 @@
{
"entity_id": 0,
"entity_summary": {
- "OperatorNewDeletePointersAnalysisResult": [
+ "TypeConstrainedPointersAnalysisResult": [
"not-an-object"
]
}
}
],
- "summary_name": "OperatorNewDeletePointers"
+ "summary_name": "TypeConstrainedPointers"
}
],
"id_table": [
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-no-key.json b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-no-key.json
similarity index 91%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-no-key.json
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-no-key.json
index 0ebf0c5719ede..3608117904567 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary-no-key.json
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary-no-key.json
@@ -9,7 +9,7 @@
}
}
],
- "summary_name": "OperatorNewDeletePointers"
+ "summary_name": "TypeConstrainedPointers"
}
],
"id_table": [
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary.json b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary.json
similarity index 90%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary.json
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary.json
index 1af51091706e6..a6231439888c5 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/tu-summary.json
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/tu-summary.json
@@ -5,7 +5,7 @@
{
"entity_id": 0,
"entity_summary": {
- "OperatorNewDeletePointersAnalysisResult": [
+ "TypeConstrainedPointersAnalysisResult": [
{
"@": 1
},
@@ -16,7 +16,7 @@
}
}
],
- "summary_name": "OperatorNewDeletePointers"
+ "summary_name": "TypeConstrainedPointers"
}
],
"id_table": [
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-bad-id.json b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-bad-id.json
similarity index 53%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-bad-id.json
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-bad-id.json
index db3209c18028e..519ab894cb20d 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-bad-id.json
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-bad-id.json
@@ -2,9 +2,9 @@
"id_table": [],
"results": [
{
- "analysis_name": "OperatorNewDeletePointersAnalysisResult",
+ "analysis_name": "TypeConstrainedPointersAnalysisResult",
"result": {
- "OperatorNewDeletePointersAnalysisResult": [
+ "TypeConstrainedPointersAnalysisResult": [
"not-an-object"
]
}
diff --git a/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-empty.json b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-empty.json
new file mode 100644
index 0000000000000..6b396740438f9
--- /dev/null
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-empty.json
@@ -0,0 +1,12 @@
+{
+ "id_table": [],
+ "results": [
+ {
+ "analysis_name": "TypeConstrainedPointersAnalysisResult",
+ "result": {
+ "TypeConstrainedPointersAnalysisResult": []
+ }
+ }
+ ],
+ "type": "WPASuite"
+}
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-no-key.json b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-no-key.json
similarity index 65%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-no-key.json
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-no-key.json
index 262bef0bc96ec..ece27ea2a3410 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/Inputs/wpa-result-no-key.json
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/Inputs/wpa-result-no-key.json
@@ -2,7 +2,7 @@
"id_table": [],
"results": [
{
- "analysis_name": "OperatorNewDeletePointersAnalysisResult",
+ "analysis_name": "TypeConstrainedPointersAnalysisResult",
"result": {
"WrongKey": []
}
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/tu-summary-serialization.test b/clang/test/Analysis/Scalable/TypeConstrainedPointers/tu-summary-serialization.test
similarity index 81%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/tu-summary-serialization.test
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/tu-summary-serialization.test
index acb5c802cadb6..047fa993cd6cd 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/tu-summary-serialization.test
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/tu-summary-serialization.test
@@ -4,10 +4,10 @@
// Negative tests:
-// Missing the OperatorNewDeletePointersAnalysisResult key in the entity summary.
+// Missing the TypeConstrainedPointersAnalysisResult key in the entity summary.
// RUN: not clang-ssaf-format -type=tu %S/Inputs/tu-summary-no-key.json 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-MISSING-KEY
-// CHECK-MISSING-KEY: saw an object of 1 key(s) but expected An object with a key OperatorNewDeletePointersAnalysisResult
+// CHECK-MISSING-KEY: saw an object of 1 key(s) but expected An object with a key TypeConstrainedPointersAnalysisResult
// Array element is not an object.
// RUN: not clang-ssaf-format -type=tu %S/Inputs/tu-summary-bad-id.json 2>&1 \
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/operator-new-delete.cpp b/clang/test/Analysis/Scalable/TypeConstrainedPointers/type-constrained-pointers.cpp
similarity index 90%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/operator-new-delete.cpp
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/type-constrained-pointers.cpp
index 30e3e9caef9c2..2d2e39824e016 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/operator-new-delete.cpp
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/type-constrained-pointers.cpp
@@ -1,16 +1,16 @@
-// End-to-end test of the operator new/delete pointer analysis.
+// End-to-end test of the Type Constrained Pointers analysis.
// RUN: rm -rf %t && mkdir -p %t
// RUN: %clang_cc1 -fsyntax-only %s \
-// RUN: --ssaf-extract-summaries=OperatorNewDeletePointers \
+// RUN: --ssaf-extract-summaries=TypeConstrainedPointers \
// RUN: --ssaf-tu-summary-file=%t/tu.summary.json \
// RUN: --ssaf-compilation-unit-id="tu-1"
// RUN: clang-ssaf-linker %t/tu.summary.json -o %t/lu.json
// RUN: clang-ssaf-analyzer %t/lu.json -o %t/wpa.json \
-// RUN: -a OperatorNewDeletePointersAnalysisResult
+// RUN: -a TypeConstrainedPointersAnalysisResult
// RUN: FileCheck %s --input-file=%t/wpa.json
@@ -46,7 +46,7 @@ void operator delete(void *ptr, void *placement) noexcept {}
// CHECK-DAG: "id": [[DEL_PLACE_PTR_ID:[0-9]+]],{{([^]]|[[:space:]])+\],[[:space:]]+"suffix": "1",[[:space:]]+"usr": }}"c:@F at operator delete#*v#S0_#"
// CHECK-DAG: "id": [[DEL_PLACE_PARAM_ID:[0-9]+]],{{([^]]|[[:space:]])+\],[[:space:]]+"suffix": "2",[[:space:]]+"usr": }}"c:@F at operator delete#*v#S0_#"
-// CHECK: "analysis_name": "OperatorNewDeletePointersAnalysisResult"
+// CHECK: "analysis_name": "TypeConstrainedPointersAnalysisResult"
// CHECK-DAG: "@": [[NEW_RET_ID]]
// CHECK-DAG: "@": [[NEW_PLACE_RET_ID]]
diff --git a/clang/test/Analysis/Scalable/OperatorNewDelete/wpa-result-serialization.test b/clang/test/Analysis/Scalable/TypeConstrainedPointers/wpa-result-serialization.test
similarity index 77%
rename from clang/test/Analysis/Scalable/OperatorNewDelete/wpa-result-serialization.test
rename to clang/test/Analysis/Scalable/TypeConstrainedPointers/wpa-result-serialization.test
index 0aca3af29a5c8..ae2d09e021227 100644
--- a/clang/test/Analysis/Scalable/OperatorNewDelete/wpa-result-serialization.test
+++ b/clang/test/Analysis/Scalable/TypeConstrainedPointers/wpa-result-serialization.test
@@ -5,13 +5,13 @@
// Generate wpa.json from the C++ source file so the test stays in sync with
// the extractor output rather than relying on a hand-crafted snapshot.
-// RUN: %clang_cc1 -fsyntax-only %S/operator-new-delete.cpp \
-// RUN: --ssaf-extract-summaries=OperatorNewDeletePointers \
+// RUN: %clang_cc1 -fsyntax-only %S/type-constrained-pointers.cpp \
+// RUN: --ssaf-extract-summaries=TypeConstrainedPointers \
// RUN: --ssaf-tu-summary-file=%t/tu.summary.json \
// RUN: --ssaf-compilation-unit-id="tu-1"
// RUN: clang-ssaf-linker %t/tu.summary.json -o %t/lu.json
// RUN: clang-ssaf-analyzer %t/lu.json -o %t/wpa.json \
-// RUN: -a OperatorNewDeletePointersAnalysisResult
+// RUN: -a TypeConstrainedPointersAnalysisResult
// RUN: clang-ssaf-format --type wpa %t/wpa.json -o %t/wpa-round-trip.json
// RUN:
diff %t/wpa.json %t/wpa-round-trip.json
@@ -20,12 +20,12 @@
// Negative tests:
-// Missing the OperatorNewDeletePointersAnalysisResult key in the result object.
+// Missing the TypeConstrainedPointersAnalysisResult key in the result object.
// RUN: not clang-ssaf-format --type wpa %S/Inputs/wpa-result-no-key.json 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-MISSING-KEY
-// CHECK-MISSING-KEY: saw an object of 1 key(s) but expected An object with a key OperatorNewDeletePointersAnalysisResult
+// CHECK-MISSING-KEY: saw an object of 1 key(s) but expected An object with a key TypeConstrainedPointersAnalysisResult
// Array element is not an object.
// RUN: not clang-ssaf-format --type wpa %S/Inputs/wpa-result-bad-id.json 2>&1 \
// RUN: | FileCheck %s --check-prefix=CHECK-BAD-ID
-// CHECK-BAD-ID: saw "not-an-object" but expected an object representing EntityId
+// CHECK-BAD-ID: saw "not-an-object" but expected an object representing EntityId
\ No newline at end of file
diff --git a/clang/unittests/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointersExtractorTest.cpp b/clang/unittests/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointersExtractorTest.cpp
similarity index 85%
rename from clang/unittests/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointersExtractorTest.cpp
rename to clang/unittests/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointersExtractorTest.cpp
index 055e599e1af43..68ce35aa2a695 100644
--- a/clang/unittests/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointersExtractorTest.cpp
+++ b/clang/unittests/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointersExtractorTest.cpp
@@ -1,4 +1,4 @@
-//===- OperatorNewDeletePointersExtractorTest.cpp -------------------------===//
+//===- TypeConstrainedPointersExtractorTest.cpp ---------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
@@ -12,7 +12,7 @@
#include "clang/AST/Decl.h"
#include "clang/Frontend/ASTUnit.h"
#include "clang/Frontend/SSAFOptions.h"
-#include "clang/ScalableStaticAnalysis/Analyses/OperatorNewDelete/OperatorNewDeletePointers.h"
+#include "clang/ScalableStaticAnalysis/Analyses/TypeConstrainedPointers/TypeConstrainedPointers.h"
#include "clang/ScalableStaticAnalysis/Core/Model/EntityId.h"
#include "clang/ScalableStaticAnalysis/Core/TUSummary/ExtractorRegistry.h"
#include "clang/ScalableStaticAnalysis/Core/TUSummary/TUSummary.h"
@@ -71,7 +71,7 @@ const SummaryT *getEntitySummary(llvm::StringRef ContributorName,
return static_cast<const SummaryT *>(EntIt->second.get());
}
-class OperatorNewDeletePointersExtractorTest : public ssaf::TestFixture {
+class TypeConstrainedPointersExtractorTest : public ssaf::TestFixture {
protected:
SSAFOptions Opts;
TUSummary TUSum;
@@ -79,7 +79,7 @@ class OperatorNewDeletePointersExtractorTest : public ssaf::TestFixture {
std::unique_ptr<TUSummaryExtractor> Extractor;
std::unique_ptr<ASTUnit> AST;
- OperatorNewDeletePointersExtractorTest()
+ TypeConstrainedPointersExtractorTest()
: TUSum(llvm::Triple("arm64-apple-macosx"),
BuildNamespace(BuildNamespaceKind::CompilationUnit, "Mock.cpp")),
Builder(TUSum, Opts), Extractor(nullptr) {}
@@ -91,22 +91,22 @@ class OperatorNewDeletePointersExtractorTest : public ssaf::TestFixture {
return false;
}
for (auto &E : TUSummaryExtractorRegistry::entries()) {
- if (E.getName() == OperatorNewDeletePointersEntitySummary::Name) {
+ if (E.getName() == TypeConstrainedPointersEntitySummary::Name) {
Extractor = E.instantiate(Builder);
break;
}
}
if (!Extractor) {
- ADD_FAILURE() << "failed to find OperatorNewDeletePointersExtractor";
+ ADD_FAILURE() << "failed to find TypeConstrainedPointersExtractor";
return false;
}
Extractor->HandleTranslationUnit(AST->getASTContext());
return true;
}
- const OperatorNewDeletePointersEntitySummary *
+ const TypeConstrainedPointersEntitySummary *
getEntitySummary(llvm::StringRef FnName) {
- return ::getEntitySummary<OperatorNewDeletePointersEntitySummary>(
+ return ::getEntitySummary<TypeConstrainedPointersEntitySummary>(
FnName, AST->getASTContext(), *Extractor, getData(TUSum));
}
@@ -127,16 +127,16 @@ class OperatorNewDeletePointersExtractorTest : public ssaf::TestFixture {
// Registration sanity
//===----------------------------------------------------------------------===//
-TEST(OperatorNewDeletePointersExtractorRegistration, ExtractorRegistered) {
+TEST(TypeConstrainedPointersExtractorRegistration, ExtractorRegistered) {
EXPECT_TRUE(isTUSummaryExtractorRegistered(
- OperatorNewDeletePointersEntitySummary::Name));
+ TypeConstrainedPointersEntitySummary::Name));
}
//===----------------------------------------------------------------------===//
// Extractor cases
//===----------------------------------------------------------------------===//
-TEST_F(OperatorNewDeletePointersExtractorTest, FreeOperatorDelete) {
+TEST_F(TypeConstrainedPointersExtractorTest, FreeOperatorDelete) {
ASSERT_TRUE(setUpTest(R"cpp(
void operator delete(void *ptr) noexcept;
void operator delete(void *ptr) noexcept { (void)ptr; }
@@ -153,7 +153,7 @@ TEST_F(OperatorNewDeletePointersExtractorTest, FreeOperatorDelete) {
EXPECT_EQ(*S, std::set<EntityId>{*PtrId});
}
-TEST_F(OperatorNewDeletePointersExtractorTest, MemberOperatorDelete) {
+TEST_F(TypeConstrainedPointersExtractorTest, MemberOperatorDelete) {
ASSERT_TRUE(setUpTest(R"cpp(
class T {
public:
@@ -171,7 +171,7 @@ TEST_F(OperatorNewDeletePointersExtractorTest, MemberOperatorDelete) {
EXPECT_EQ(*S, std::set<EntityId>{*PId});
}
-TEST_F(OperatorNewDeletePointersExtractorTest, OperatorDeleteArray) {
+TEST_F(TypeConstrainedPointersExtractorTest, OperatorDeleteArray) {
ASSERT_TRUE(setUpTest(R"cpp(
void operator delete[](void *p) noexcept;
void operator delete[](void *p) noexcept { (void)p; }
@@ -187,7 +187,7 @@ TEST_F(OperatorNewDeletePointersExtractorTest, OperatorDeleteArray) {
EXPECT_EQ(*S, std::set<EntityId>{*PId});
}
-TEST_F(OperatorNewDeletePointersExtractorTest, OperatorNew) {
+TEST_F(TypeConstrainedPointersExtractorTest, OperatorNew) {
ASSERT_TRUE(setUpTest(R"cpp(
typedef unsigned long size_t;
void *operator new(size_t size);
@@ -204,7 +204,7 @@ TEST_F(OperatorNewDeletePointersExtractorTest, OperatorNew) {
EXPECT_EQ(*S, std::set<EntityId>{*RetId});
}
-TEST_F(OperatorNewDeletePointersExtractorTest, PlacementNew) {
+TEST_F(TypeConstrainedPointersExtractorTest, PlacementNew) {
ASSERT_TRUE(setUpTest(R"cpp(
typedef unsigned long size_t;
void *operator new(size_t size, void *placement) noexcept;
@@ -225,7 +225,7 @@ TEST_F(OperatorNewDeletePointersExtractorTest, PlacementNew) {
EXPECT_EQ(*S, (std::set<EntityId>{*PlacementId, *RetId}));
}
-TEST_F(OperatorNewDeletePointersExtractorTest, PlacementDelete) {
+TEST_F(TypeConstrainedPointersExtractorTest, PlacementDelete) {
ASSERT_TRUE(setUpTest(R"cpp(
void operator delete(void *ptr, void *placement) noexcept;
void operator delete(void *ptr, void *placement) noexcept {
@@ -245,14 +245,14 @@ TEST_F(OperatorNewDeletePointersExtractorTest, PlacementDelete) {
EXPECT_EQ(*S, (std::set<EntityId>{*PtrId, *PlacementId}));
}
-TEST_F(OperatorNewDeletePointersExtractorTest, NoOperatorNewOrDeleteSummary) {
+TEST_F(TypeConstrainedPointersExtractorTest, NoOperatorNewOrDeleteSummary) {
ASSERT_TRUE(setUpTest(R"cpp(
class T { int x; };
)cpp"));
auto &TUData = getData(TUSum);
auto TUSummariesIter =
- TUData.find(OperatorNewDeletePointersEntitySummary::summaryName());
+ TUData.find(TypeConstrainedPointersEntitySummary::summaryName());
ASSERT_EQ(TUSummariesIter, TUData.end());
}
diff --git a/clang/unittests/ScalableStaticAnalysis/CMakeLists.txt b/clang/unittests/ScalableStaticAnalysis/CMakeLists.txt
index 08f82876aabf1..061c8a4d9069e 100644
--- a/clang/unittests/ScalableStaticAnalysis/CMakeLists.txt
+++ b/clang/unittests/ScalableStaticAnalysis/CMakeLists.txt
@@ -2,7 +2,7 @@ add_distinct_clang_unittest(ClangScalableAnalysisTests
Analyses/PointerFlow/PointerFlowTest.cpp
Analyses/PointerFlow/PointerFlowWPATest.cpp
Analyses/CallGraph/CallGraphExtractorTest.cpp
- Analyses/OperatorNewDelete/OperatorNewDeletePointersExtractorTest.cpp
+ Analyses/TypeConstrainedPointers/TypeConstrainedPointersExtractorTest.cpp
Analyses/UnsafeBufferUsage/UnsafeBufferUsageTest.cpp
Analyses/UnsafeBufferUsage/UnsafeBufferUsageWPATest.cpp
ASTEntityMappingTest.cpp
More information about the cfe-commits
mailing list