clang 23.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
19#include "llvm/ADT/STLExtras.h"
20#include "llvm/ADT/STLFunctionalExtras.h"
21#include "llvm/Support/ErrorHandling.h"
22#include <memory>
23
24using namespace clang;
25using namespace ssaf;
26
27namespace clang::ssaf {
29public:
32
33 /// \return a non-null unique pointer to a UnsafeBufferUsageEntitySummary
34 std::unique_ptr<UnsafeBufferUsageEntitySummary>
35 extractEntitySummary(const std::vector<const NamedDecl *> &ContributorDecls,
36 ASTContext &Ctx);
37 void HandleTranslationUnit(ASTContext &Ctx) override;
38};
39} // namespace clang::ssaf
40
41std::unique_ptr<UnsafeBufferUsageEntitySummary>
43 const std::vector<const NamedDecl *> &ContributorDecls, ASTContext &Ctx) {
44 std::set<const Expr *> UnsafePointers;
45 auto MatchAction = [&UnsafePointers, &Ctx](const DynTypedNode &Node) {
46 matchUnsafePointers(Node, Ctx, UnsafePointers);
47 };
48
49 for (const auto *Contrib : ContributorDecls)
50 findMatchesIn(Contrib, MatchAction);
51
52 EntityPointerLevelSet Results;
53
54 for (const Expr *Ptr : UnsafePointers) {
56 translateEntityPointerLevel(Ptr, Ctx, *this);
57
58 if (Translation) {
59 // Filter out those temporary invalid EntityPointerLevels associated
60 // with `&E` pointers. They need no transformation of entities:
61 auto FilteredTranslation = llvm::make_filter_range(
62 *Translation, [](const EntityPointerLevel &E) -> bool {
63 return E.getPointerLevel() > 0;
64 });
65 Results.insert(FilteredTranslation.begin(), FilteredTranslation.end());
66 continue;
67 }
68 logWarningFromError(Translation.takeError());
69 }
70
71 return std::make_unique<UnsafeBufferUsageEntitySummary>(
72 UnsafeBufferUsageEntitySummary(std::move(Results)));
73}
74
76 ASTContext &Ctx) {
78 *this, SummaryBuilder, Ctx,
79 [&](const std::vector<const NamedDecl *> &Decls) {
80 return extractEntitySummary(Decls, Ctx);
81 },
82 "UnsafeBufferUsage");
83}
84namespace clang::ssaf {
85// NOLINTNEXTLINE(misc-use-internal-linkage)
87} // namespace clang::ssaf
88
89static clang::ssaf::TUSummaryExtractorRegistry::Add<
92 "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 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.
void extractAndAddSummaries(TUSummaryExtractor &Extractor, TUSummaryBuilder &Builder, ASTContext &Ctx, ExtractorFnT ExtractFn, const char *ExtractorName="")
The standard contributor-summary extraction procedure:
The JSON file list parser is used to communicate input to InstallAPI.
bool matchUnsafePointers(const DynTypedNode &N, ASTContext &Ctx, std::set< const Expr * > &UnsafePointers)