clang 23.0.0git
UnsafeBufferUsageFormat.cpp
Go to the documentation of this file.
1//===- UnsafeBufferUsageFormat.cpp ----------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
15#include "llvm/Support/Error.h"
16#include "llvm/Support/JSON.h"
17#include <cstdint>
18
19using namespace clang;
20using namespace ssaf;
21using Array = llvm::json::Array;
22using Object = llvm::json::Object;
23
24static constexpr llvm::StringLiteral SummarySerializationKey = "UnsafeBuffers";
25
27ssaf::buildUnsafeBufferUsageEntitySummary(EntityPointerLevelSet UnsafeBuffers);
28
29extern llvm::iterator_range<EntityPointerLevelSet::const_iterator>
30ssaf::getUnsafeBuffers(const UnsafeBufferUsageEntitySummary &S);
31
34 const auto &SS = static_cast<const UnsafeBufferUsageEntitySummary &>(S);
35 Array UnsafeBuffersData;
36
37 for (const auto &EPL : getUnsafeBuffers(SS))
38 UnsafeBuffersData.push_back(entityPointerLevelToJSON(EPL, Fn));
39 return Object{{SummarySerializationKey.data(), std::move(UnsafeBuffersData)}};
40}
41
44 const Array *UnsafeBuffersData =
45 Data.getArray(SummarySerializationKey.data());
46
47 if (!UnsafeBuffersData)
48 return makeSawButExpectedError(Object(Data), "an Object with a key %s",
50
51 EntityPointerLevelSet EPLs;
52
53 for (const auto &EltData : *UnsafeBuffersData) {
55 entityPointerLevelFromJSON(EltData, Fn);
56
57 if (!EPL)
58 return EPL.takeError();
59 EPLs.insert(*EPL);
60 }
61 return std::make_unique<UnsafeBufferUsageEntitySummary>(
62 buildUnsafeBufferUsageEntitySummary(std::move(EPLs)));
63}
64
70
71namespace {
72struct UnsafeBufferUsageJSONFormatInfo final : JSONFormat::FormatInfo {
73 UnsafeBufferUsageJSONFormatInfo()
74 : JSONFormat::FormatInfo(UnsafeBufferUsageEntitySummary::summaryName(),
76};
77} // namespace
78
79static llvm::Registry<JSONFormat::FormatInfo>::Add<
80 UnsafeBufferUsageJSONFormatInfo>
83 "JSON Format info for UnsafeBufferUsageEntitySummary");
84
85// NOLINTNEXTLINE(misc-use-internal-linkage)
87
88// For unit test:
92 std::function<uint64_t(EntityId)> IdToIntFn,
93 std::function<llvm::Expected<EntityId>(uint64_t)> IdFromIntFn) {
94
95 auto IdToJson = [&IdToIntFn](EntityId Id) -> Object {
96 return Object({{"@", IdToIntFn(Id)}});
97 };
98 auto IdFromJson =
99 [&IdFromIntFn](const Object &O) -> llvm::Expected<EntityId> {
100 const auto *Int = O.get("@");
101
102 if (Int && Int->getAsUINT64())
103 return IdFromIntFn(*Int->getAsUINT64());
104 return llvm::createStringError("failed to get EntityId from Object");
105 };
106
107 return deserializeImpl(serialize(S, IdToJson), IdFromJson);
108}
llvm::json::Object Object
llvm::json::Array Array
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")
static Object serialize(const EntitySummary &S, JSONFormat::EntityIdToJSONFn Fn)
static constexpr llvm::StringLiteral SummarySerializationKey
Manages entity name interning and provides efficient EntityId handles.
Lightweight opaque handle representing an entity in an EntityIdTable.
Definition EntityId.h:31
Base class for analysis-specific summary data.
llvm::function_ref< llvm::Expected< EntityId >(const Object &)> EntityIdFromJSONFn
Definition JSONFormat.h:71
FormatInfoEntry< SerializerFn, DeserializerFn > FormatInfo
Definition JSONFormat.h:80
llvm::function_ref< Object(EntityId)> EntityIdToJSONFn
Definition JSONFormat.h:70
An UnsafeBufferUsageEntitySummary contains a set of EntityPointerLevels extracted from unsafe buffer ...
static constexpr llvm::StringLiteral Name
llvm::json::Value entityPointerLevelToJSON(const EntityPointerLevel &EPL, JSONFormat::EntityIdToJSONFn EntityId2JSON)
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::Error makeSawButExpectedError(const JSONTy &Saw, llvm::StringRef Expected, const Ts &...ExpectedArgs)
llvm::json::Object Object
Expected< EntityPointerLevel > entityPointerLevelFromJSON(const llvm::json::Value &EPLData, JSONFormat::EntityIdFromJSONFn EntityIdFromJSON)
The JSON file list parser is used to communicate input to InstallAPI.
int const char * function
Definition c++config.h:31