================ @@ -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
