43#include "llvm/ADT/StringRef.h"
44#include "llvm/Support/Error.h"
45#include "llvm/Support/JSON.h"
61 void HandleTranslationUnit(ASTContext &Ctx)
override;
63 std::unique_ptr<OperatorNewDeletePointersEntitySummary>
64 extractEntitySummary(
const std::vector<const NamedDecl *> &Decls);
67void OperatorNewDeletePointersExtractor::HandleTranslationUnit(
70 *
this, SummaryBuilder, Ctx,
71 [&](
const std::vector<const NamedDecl *> &Decls) {
72 return extractEntitySummary(Decls);
77std::unique_ptr<OperatorNewDeletePointersEntitySummary>
78OperatorNewDeletePointersExtractor::extractEntitySummary(
79 const std::vector<const NamedDecl *> &ContributorDecls) {
80 auto Summary = std::make_unique<OperatorNewDeletePointersEntitySummary>();
81 auto Matcher = [&Summary,
this](
const DynTypedNode &Node) {
82 const auto *FD = Node.get<FunctionDecl>();
93 if (
auto Id = addEntityForReturn(FD))
94 Summary->Entities.insert(*Id);
101 if (
auto Id = addEntity(FD->getParamDecl(0)))
102 Summary->Entities.insert(*Id);
112 if (
auto Id = addEntity(FD->getParamDecl(1)))
113 Summary->Entities.insert(*Id);
117 for (
const NamedDecl *Decl : ContributorDecls)
125class OperatorNewDeletePointersAnalysis final
126 :
public SummaryAnalysis<OperatorNewDeletePointersAnalysisResult,
127 OperatorNewDeletePointersEntitySummary> {
131 const OperatorNewDeletePointersEntitySummary &Summary)
override {
132 getResult().Entities.insert(Summary.
Entities.begin(),
134 return llvm::Error::success();
138AnalysisRegistry::Add<OperatorNewDeletePointersAnalysis>
139 RegisterOperatorNewDeletePointersAnalysis(
140 "Whole-program set of pointer entities in operator new/delete "
141 "overloads that must retain their 'void*' type");
147llvm::json::Object serializeImpl(
const std::set<EntityId> &
Set,
149 llvm::json::Object
Result;
150 llvm::json::Array DataArray;
152 DataArray.reserve(
Set.size());
153 for (
const auto &Ent :
Set)
154 DataArray.push_back(
Fn(Ent));
159llvm::Expected<std::set<EntityId>>
162 const auto *DataArray =
164 std::set<EntityId> EntitySet;
168 Data,
"An object with a key %s",
171 for (
const auto &Elt : *DataArray) {
172 const auto *EltAsObj = Elt.getAsObject();
177 Expected<EntityId> EntityId =
Fn(*EltAsObj);
180 return EntityId.takeError();
182 EntitySet.insert(*EntityId);
187llvm::json::Object serializeSummary(
const EntitySummary &S,
190 static_cast<const OperatorNewDeletePointersEntitySummary &
>(S);
191 return serializeImpl(SS.Entities, Fn);
194llvm::Expected<std::unique_ptr<EntitySummary>>
195deserializeSummary(
const llvm::json::Object &
Data, EntityIdTable &,
200 return EntityIDSet.takeError();
202 std::unique_ptr<OperatorNewDeletePointersEntitySummary> Sum =
203 std::make_unique<OperatorNewDeletePointersEntitySummary>();
205 Sum->Entities = std::move(*EntityIDSet);
210 OperatorNewDeletePointersJSONFormatInfo()
211 : JSONFormat::FormatInfo(
212 OperatorNewDeletePointersEntitySummary::summaryName(),
213 serializeSummary, deserializeSummary) {}
216static llvm::Registry<JSONFormat::FormatInfo>::Add<
217 OperatorNewDeletePointersJSONFormatInfo>
218 RegisterOperatorNewDeletePointersJSONFormatInfo(
220 "JSON Format info for OperatorNewDeletePointersEntitySummary");
223serializeAnalysisResult(
const OperatorNewDeletePointersAnalysisResult &R,
225 return serializeImpl(
R.Entities, Fn);
228llvm::Expected<std::unique_ptr<AnalysisResult>>
229deserializeAnalysisResult(
const llvm::json::Object &
Data,
234 return EntityIDSet.takeError();
236 std::unique_ptr<OperatorNewDeletePointersAnalysisResult> AR =
237 std::make_unique<OperatorNewDeletePointersAnalysisResult>();
239 AR->Entities = std::move(*EntityIDSet);
243JSONFormat::AnalysisResultRegistry::Add<OperatorNewDeletePointersAnalysisResult>
244 RegisterNewDeletePointersAnalysisResultForJSON(serializeAnalysisResult,
245 deserializeAnalysisResult);
249namespace clang::ssaf {
254static TUSummaryExtractorRegistry::Add<OperatorNewDeletePointersExtractor>
257 "Extract pointer entities in operator new/delete overloads that must "
258 "have a 'void*' type");
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
Result
Implement __builtin_bit_cast and related operations.
Defines an enumeration for C++ overloaded operators.
static TUSummaryExtractorRegistry::Add< OperatorNewDeletePointersExtractor > RegisterOperatorNewDeletePointersExtractor(OperatorNewDeletePointersEntitySummary::Name, "Extract pointer entities in operator new/delete overloads that must " "have a 'void*' type")
C Language Family Type Representation.
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
DynTypedNode DynTypedNode
void extractAndAddSummaries(TUSummaryExtractor &Extractor, TUSummaryBuilder &Builder, ASTContext &Ctx, ExtractorFnT ExtractFn, llvm::StringRef ExtractorName="")
The standard contributor-summary extraction procedure:
bool hasPtrOrArrType(const Expr *E)
volatile int OperatorNewDeletePointersAnchorSource
void findMatchesIn(const NamedDecl *Contributor, llvm::function_ref< void(const DynTypedNode &)> MatchActionRef)
Perform "MatchAction" on each Stmt and Decl belonging to the Contributor.
llvm::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
static constexpr llvm::StringLiteral Name
static constexpr llvm::StringLiteral Name
std::set< EntityId > Entities