================
@@ -0,0 +1,127 @@
+//===- UnsafeBufferUsage.cpp 
----------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include 
"clang/ScalableStaticAnalysisFramework/Analyses/UnsafeBufferUsage/UnsafeBufferUsage.h"
+#include "clang/ScalableStaticAnalysisFramework/Core/Model/EntityId.h"
+#include 
"clang/ScalableStaticAnalysisFramework/Core/Serialization/JSONFormat.h"
+#include "clang/ScalableStaticAnalysisFramework/SSAFBuiltinForceLinker.h" // 
IWYU pragma: keep
+#include "llvm/Support/Error.h"
+#include "llvm/Support/JSON.h"
+#include <cstdint>
+
+using namespace clang;
+using namespace ssaf;
+using Array = llvm::json::Array;
+using Object = llvm::json::Object;
+
+namespace {
+static constexpr llvm::StringLiteral SummarySerializationKey = "UnsafeBuffers";
+} // namespace
+
+namespace clang::ssaf {
+EntityPointerLevel buildEntityPointerLevel(EntityId Id, unsigned PtrLv) {
+  return EntityPointerLevel(Id, PtrLv);
+}
+
+UnsafeBufferUsageEntitySummary
+buildUnsafeBufferUsageEntitySummary(EntityPointerLevelSet UnsafeBuffers) {
+  return UnsafeBufferUsageEntitySummary(std::move(UnsafeBuffers));
+}
+
+llvm::iterator_range<EntityPointerLevelSet::const_iterator>
+getUnsafeBuffers(const UnsafeBufferUsageEntitySummary &S) {
+  return llvm::make_range(S.UnsafeBuffers.begin(), S.UnsafeBuffers.end());
+}
+} // namespace clang::ssaf
+
+Object static serialize(const EntitySummary &S,
+                        JSONFormat::EntityIdToJSONFn Fn) {
+  const UnsafeBufferUsageEntitySummary *SS =
+      static_cast<const UnsafeBufferUsageEntitySummary *>(&S);
+  Array UnsafeBuffersData;
+
+  for (const auto &EPL : getUnsafeBuffers(*SS))
+    UnsafeBuffersData.push_back(
+        Array{Fn(EPL.getEntity()), EPL.getPointerLevel()});
+  return Object{{SummarySerializationKey.data(), 
std::move(UnsafeBuffersData)}};
+}
+
+llvm::Expected<std::unique_ptr<EntitySummary>> static deserializeImpl(
+    const Object &Data, JSONFormat::EntityIdFromJSONFn Fn) {
+  const Array *UnsafeBuffersData =
+      Data.getArray(SummarySerializationKey.data());
+
+  if (!UnsafeBuffersData)
+    return llvm::createStringError("expected a json::Object with a key %s",
+                                   SummarySerializationKey.data());
+
+  EntityPointerLevelSet EPLs;
+
+  for (auto &EltData : *UnsafeBuffersData) {
+    const Array *EltDataAsArr = EltData.getAsArray();
+
+    if (!EltDataAsArr || EltDataAsArr->size() != 2)
+      return llvm::createStringError("expected a json::Array of size 2");
+
+    const Object *IdData = (*EltDataAsArr)[0].getAsObject();
+    std::optional<uint64_t> PtrLvData = (*EltDataAsArr)[1].getAsInteger();
+
+    if (!IdData || !PtrLvData)
+      return llvm::createStringError("expected a json::Value of integer type");
+
+    llvm::Expected<EntityId> Id = Fn(*IdData);
+
+    if (!Id)
+      return Id.takeError();
+    EPLs.insert(buildEntityPointerLevel(Id.get(), *PtrLvData));
+  }
+  return std::make_unique<UnsafeBufferUsageEntitySummary>(
+      buildUnsafeBufferUsageEntitySummary(std::move(EPLs)));
+}
+
+llvm::Expected<std::unique_ptr<EntitySummary>> static deserialize(
+    const Object &Data, EntityIdTable &, JSONFormat::EntityIdFromJSONFn Fn) {
+  return deserializeImpl(Data, Fn);
+}
+
+struct UnsafeBufferUsageJSONFormatInfo : JSONFormat::FormatInfo {
+  UnsafeBufferUsageJSONFormatInfo()
+      : JSONFormat::FormatInfo(UnsafeBufferUsageEntitySummary::summaryName(),
+                               serialize, deserialize) {}
+};
----------------
steakhal wrote:

This still wasn't applied.

https://github.com/llvm/llvm-project/pull/187156
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to