clang 24.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
14#include "llvm/Support/Error.h"
15#include "llvm/Support/JSON.h"
16
17using namespace clang;
18using namespace ssaf;
19using Array = llvm::json::Array;
20using Object = llvm::json::Object;
21
22static constexpr llvm::StringLiteral SummarySerializationKey = "UnsafeBuffers";
23
26 const auto &SS = static_cast<const UnsafeBufferUsageEntitySummary &>(S);
27 Array UnsafeBuffersData;
28
29 for (const auto &EPL : getUnsafeBuffers(SS))
30 UnsafeBuffersData.push_back(entityPointerLevelToJSON(EPL, Fn));
31 return Object{{SummarySerializationKey.data(), std::move(UnsafeBuffersData)}};
32}
33
36 const Array *UnsafeBuffersData =
37 Data.getArray(SummarySerializationKey.data());
38
39 if (!UnsafeBuffersData)
40 return makeSawButExpectedError(Object(Data), "an Object with a key %s",
42
43 EntityPointerLevelSet EPLs;
44
45 for (const auto &EltData : *UnsafeBuffersData) {
47 entityPointerLevelFromJSON(EltData, Fn);
48
49 if (!EPL)
50 return EPL.takeError();
51 EPLs.insert(*EPL);
52 }
53 return std::make_unique<UnsafeBufferUsageEntitySummary>(
55}
56
62
63namespace {
64struct UnsafeBufferUsageJSONFormatInfo final : JSONFormat::FormatInfo {
65 UnsafeBufferUsageJSONFormatInfo()
66 : JSONFormat::FormatInfo(UnsafeBufferUsageEntitySummary::summaryName(),
68};
69} // namespace
70
71static llvm::Registry<JSONFormat::FormatInfo>::Add<
72 UnsafeBufferUsageJSONFormatInfo>
75 "JSON Format info for UnsafeBufferUsageEntitySummary");
76
77namespace clang::ssaf {
78// NOLINTNEXTLINE(misc-use-internal-linkage)
80} // namespace clang::ssaf
llvm::json::Object Object
llvm::json::Array Array
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.
Base class for analysis-specific summary data.
llvm::function_ref< llvm::Expected< EntityId >(const Object &)> EntityIdFromJSONFn
Definition JSONFormat.h:99
FormatInfoEntry< SerializerFn, DeserializerFn > FormatInfo
Definition JSONFormat.h:108
llvm::function_ref< Object(EntityId)> EntityIdToJSONFn
Definition JSONFormat.h:98
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::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)
volatile int UnsafeBufferUsageJSONFormatAnchorSource
llvm::iterator_range< EntityPointerLevelSet::const_iterator > getUnsafeBuffers(const UnsafeBufferUsageEntitySummary &)
UnsafeBufferUsageEntitySummary buildUnsafeBufferUsageEntitySummary(EntityPointerLevelSet)
Top level wrappers for InstallAPI frontend operations.