clang 24.0.0git
UnsafeBufferUsageExtractor.cpp
Go to the documentation of this file.
1//===- UnsafeBufferUsageExtractor.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
20#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/STLFunctionalExtras.h"
22#include "llvm/Support/ErrorHandling.h"
23#include <memory>
24
25using namespace clang;
26using namespace ssaf;
27
28namespace clang::ssaf {
30public:
33
34 /// \return a non-null unique pointer to a UnsafeBufferUsageEntitySummary
35 std::unique_ptr<UnsafeBufferUsageEntitySummary>
36 extractEntitySummary(const std::vector<const NamedDecl *> &ContributorDecls,
37 ASTContext &Ctx);
38 void HandleTranslationUnit(ASTContext &Ctx) override;
39};
40} // namespace clang::ssaf
41
42std::unique_ptr<UnsafeBufferUsageEntitySummary>
44 const std::vector<const NamedDecl *> &ContributorDecls, ASTContext &Ctx) {
45 std::set<const Expr *> UnsafePointers;
46 auto MatchAction = [&UnsafePointers, &Ctx](const DynTypedNode &Node) {
47 matchUnsafePointers(Node, Ctx, UnsafePointers);
48 };
49
50 for (const auto *Contrib : ContributorDecls)
51 findMatchesIn(Contrib, MatchAction);
52
53 EntityPointerLevelSet Results;
54
55 for (const Expr *Ptr : UnsafePointers) {
57 translateEntityPointerLevel(Ptr, Ctx, *this);
58
59 if (Translation) {
60 // Filter out those temporary invalid EntityPointerLevels associated
61 // with `&E` pointers. They need no transformation of entities:
62 auto FilteredTranslation = llvm::make_filter_range(
63 *Translation, [](const EntityPointerLevel &E) -> bool {
64 return E.getPointerLevel() > 0;
65 });
66 Results.insert(FilteredTranslation.begin(), FilteredTranslation.end());
67 continue;
68 }
69 logWarningFromError(Translation.takeError());
70 }
71
72 return std::make_unique<UnsafeBufferUsageEntitySummary>(
73 UnsafeBufferUsageEntitySummary(std::move(Results)));
74}
75
77 ASTContext &Ctx) {
79 *this, SummaryBuilder, Ctx,
80 [&](const std::vector<const NamedDecl *> &Decls) {
81 return extractEntitySummary(Decls, Ctx);
82 },
83 "UnsafeBufferUsage");
84}
85namespace clang::ssaf {
86// NOLINTNEXTLINE(misc-use-internal-linkage)
88} // namespace clang::ssaf
89
90static clang::ssaf::TUSummaryExtractorRegistry::Add<
93 "Extract unsafe buffer pointers");
Defines the clang::ASTContext interface.
static TUSummaryExtractorRegistry::Add< CallGraphExtractor > RegisterExtractor(CallGraphSummary::Name, "Extracts static call-graph information")
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:223
A dynamically typed AST node container.
This represents one expression.
Definition Expr.h:112
TUSummaryExtractor(TUSummaryBuilder &Builder)
An UnsafeBufferUsageEntitySummary contains a set of EntityPointerLevels extracted from unsafe buffer ...
static constexpr llvm::StringLiteral Name
void HandleTranslationUnit(ASTContext &Ctx) override
HandleTranslationUnit - This method is called when the ASTs for entire translation unit have been par...
std::unique_ptr< UnsafeBufferUsageEntitySummary > extractEntitySummary(const std::vector< const NamedDecl * > &ContributorDecls, ASTContext &Ctx)
void extractAndAddSummaries(TUSummaryExtractor &Extractor, TUSummaryBuilder &Builder, ASTContext &Ctx, ExtractorFnT ExtractFn, llvm::StringRef ExtractorName="")
The standard contributor-summary extraction procedure:
void logWarningFromError(llvm::Error Err)
Log a warning from an llvm::Error.
volatile int UnsafeBufferUsageExtractorAnchorSource
void findMatchesIn(const NamedDecl *Contributor, llvm::function_ref< void(const DynTypedNode &)> MatchActionRef)
Perform "MatchAction" on each Stmt and Decl belonging to the Contributor.
The JSON file list parser is used to communicate input to InstallAPI.
bool matchUnsafePointers(const DynTypedNode &N, ASTContext &Ctx, std::set< const Expr * > &UnsafePointers)