13#include "llvm/Support/Error.h"
14#include "llvm/Support/JSON.h"
24EntityPointerLevel ssaf::buildEntityPointerLevel(
EntityId Id,
unsigned PtrLv) {
25 return EntityPointerLevel(Id, PtrLv);
33llvm::iterator_range<EntityPointerLevelSet::const_iterator>
35 return llvm::make_range(S.UnsafeBuffers.begin(), S.UnsafeBuffers.end());
41 Array UnsafeBuffersData;
43 for (
const auto &EPL : getUnsafeBuffers(SS))
44 UnsafeBuffersData.push_back(
45 Array{Fn(EPL.getEntity()), EPL.getPointerLevel()});
51 const Array *UnsafeBuffersData =
54 if (!UnsafeBuffersData)
55 return llvm::createStringError(
"expected a json::Object with a key %s",
60 for (
const auto &EltData : *UnsafeBuffersData) {
61 const Array *EltDataAsArr = EltData.getAsArray();
63 if (!EltDataAsArr || EltDataAsArr->size() != 2)
64 return llvm::createStringError(
"expected a json::Array of size 2");
66 const Object *IdData = (*EltDataAsArr)[0].getAsObject();
67 std::optional<uint64_t> PtrLvData = (*EltDataAsArr)[1].getAsInteger();
69 if (!IdData || !PtrLvData)
70 return llvm::createStringError(
"expected a json::Value of integer type");
75 return Id.takeError();
76 EPLs.insert(buildEntityPointerLevel(Id.get(), *PtrLvData));
78 return std::make_unique<UnsafeBufferUsageEntitySummary>(
79 buildUnsafeBufferUsageEntitySummary(std::move(EPLs)));
94static llvm::Registry<JSONFormat::FormatInfo>::Add<
98 "JSON Format info for UnsafeBufferUsageEntitySummary");
111 return Object({{
"@", IdToIntFn(Id)}});
115 const auto *Int = O.get(
"@");
117 if (Int && Int->getAsUINT64())
118 return IdFromIntFn(*Int->getAsUINT64());
119 return llvm::createStringError(
"failed to get EntityId from Object");
volatile int UnsafeBufferUsageSSAFJSONFormatAnchorSource
static llvm::Expected< std::unique_ptr< EntitySummary > > deserialize(const Object &Data, EntityIdTable &, JSONFormat::EntityIdFromJSONFn Fn)
static llvm::Expected< std::unique_ptr< EntitySummary > > deserializeImpl(const Object &Data, JSONFormat::EntityIdFromJSONFn Fn)
static llvm::Registry< JSONFormat::FormatInfo >::Add< UnsafeBufferUsageJSONFormatInfo > RegisterUnsafeBufferUsageJSONFormatInfo(UnsafeBufferUsageEntitySummary::Name, "JSON Format info for UnsafeBufferUsageEntitySummary")
llvm::json::Object Object
static Object serialize(const EntitySummary &S, JSONFormat::EntityIdToJSONFn Fn)
static constexpr llvm::StringLiteral SummarySerializationKey
std::set< EntityPointerLevel, EntityPointerLevel::Comparator > EntityPointerLevelSet
An UnsafeBufferUsageEntitySummary is an immutable set of unsafe buffers, in the form of EntityPointer...
static constexpr llvm::StringLiteral Name
Manages entity name interning and provides efficient EntityId handles.
Lightweight opaque handle representing an entity in an EntityIdTable.
Base class for analysis-specific summary data.
llvm::Expected< std::unique_ptr< EntitySummary > > serializeDeserializeRoundTrip(const UnsafeBufferUsageEntitySummary &S, std::function< uint64_t(EntityId)> IdToIntFn, std::function< llvm::Expected< EntityId >(uint64_t)> IdFromIntFn)
llvm::json::Object Object
The JSON file list parser is used to communicate input to InstallAPI.
int const char * function