clang 23.0.0git
Environment.h
Go to the documentation of this file.
1//===- Environment.h - Map from Stmt* to Locations/Values -------*- C++ -*-===//
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//
9// This file defined the Environment and EnvironmentManager classes.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ENVIRONMENT_H
14#define LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ENVIRONMENT_H
15
19#include "llvm/ADT/ImmutableMap.h"
20#include <utility>
21
22namespace clang {
23
24class Stmt;
25
26namespace ento {
27
28class SValBuilder;
29class SymbolReaper;
30
31/// An entry in the environment consists of a Stmt and an LocationContext.
32/// This allows the environment to manage context-sensitive bindings,
33/// which is essentially for modeling recursive function analysis, among
34/// other things.
35class EnvironmentEntry : public std::pair<const Expr *, const StackFrame *> {
36public:
37 EnvironmentEntry(const Expr *E, const LocationContext *L);
38
39 const Expr *getExpr() const { return first; }
40 const LocationContext *getLocationContext() const { return second; }
41
42 /// Profile an EnvironmentEntry for inclusion in a FoldingSet.
43 static void Profile(llvm::FoldingSetNodeID &ID,
44 const EnvironmentEntry &E) {
45 ID.AddPointer(E.getExpr());
46 ID.AddPointer(E.getLocationContext());
47 }
48
49 void Profile(llvm::FoldingSetNodeID &ID) const {
50 Profile(ID, *this);
51 }
52};
53
54/// An immutable map from EnvironmentEntries to SVals.
55class Environment {
56private:
57 friend class EnvironmentManager;
58
59 using BindingsTy = llvm::ImmutableMap<EnvironmentEntry, SVal>;
60
61 BindingsTy ExprBindings;
62
63 Environment(BindingsTy eb) : ExprBindings(eb) {}
64
65 SVal lookupExpr(const EnvironmentEntry &E) const;
66
67public:
68 using iterator = BindingsTy::iterator;
69
70 iterator begin() const { return ExprBindings.begin(); }
71 iterator end() const { return ExprBindings.end(); }
72
73 /// Fetches the current binding of the expression in the
74 /// Environment.
75 SVal getSVal(const EnvironmentEntry &E, SValBuilder &svalBuilder) const;
76
77 /// Profile - Profile the contents of an Environment object for use
78 /// in a FoldingSet.
79 static void Profile(llvm::FoldingSetNodeID& ID, const Environment* env) {
80 env->ExprBindings.Profile(ID);
81 }
82
83 /// Profile - Used to profile the contents of this object for inclusion
84 /// in a FoldingSet.
85 void Profile(llvm::FoldingSetNodeID& ID) const {
86 Profile(ID, this);
87 }
88
89 bool operator==(const Environment& RHS) const {
90 return ExprBindings == RHS.ExprBindings;
91 }
92
93 void printJson(raw_ostream &Out, const ASTContext &Ctx,
94 const LocationContext *LCtx = nullptr, const char *NL = "\n",
95 unsigned int Space = 0, bool IsDot = false) const;
96};
97
99private:
100 using FactoryTy = Environment::BindingsTy::Factory;
101
102 FactoryTy F;
103
104public:
105 EnvironmentManager(llvm::BumpPtrAllocator &Allocator) : F(Allocator) {}
106
108 return Environment(F.getEmptyMap());
109 }
110
111 /// Bind a symbolic value to the given environment entry.
113 bool Invalidate);
114
116 SymbolReaper &SymReaper,
117 ProgramStateRef state);
118};
119
120} // namespace ento
121
122} // namespace clang
123
124#endif // LLVM_CLANG_STATICANALYZER_CORE_PATHSENSITIVE_ENVIRONMENT_H
#define V(N, I)
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition ASTContext.h:227
This represents one expression.
Definition Expr.h:112
Stmt - This represents one statement.
Definition Stmt.h:86
An entry in the environment consists of a Stmt and an LocationContext.
Definition Environment.h:35
const Expr * getExpr() const
Definition Environment.h:39
const LocationContext * getLocationContext() const
Definition Environment.h:40
EnvironmentEntry(const Expr *E, const LocationContext *L)
void Profile(llvm::FoldingSetNodeID &ID) const
Definition Environment.h:49
static void Profile(llvm::FoldingSetNodeID &ID, const EnvironmentEntry &E)
Profile an EnvironmentEntry for inclusion in a FoldingSet.
Definition Environment.h:43
Environment bindExpr(Environment Env, const EnvironmentEntry &E, SVal V, bool Invalidate)
Bind a symbolic value to the given environment entry.
Environment removeDeadBindings(Environment Env, SymbolReaper &SymReaper, ProgramStateRef state)
EnvironmentManager(llvm::BumpPtrAllocator &Allocator)
An immutable map from EnvironmentEntries to SVals.
Definition Environment.h:55
SVal getSVal(const EnvironmentEntry &E, SValBuilder &svalBuilder) const
Fetches the current binding of the expression in the Environment.
void Profile(llvm::FoldingSetNodeID &ID) const
Profile - Used to profile the contents of this object for inclusion in a FoldingSet.
Definition Environment.h:85
bool operator==(const Environment &RHS) const
Definition Environment.h:89
static void Profile(llvm::FoldingSetNodeID &ID, const Environment *env)
Profile - Profile the contents of an Environment object for use in a FoldingSet.
Definition Environment.h:79
friend class EnvironmentManager
Definition Environment.h:57
void printJson(raw_ostream &Out, const ASTContext &Ctx, const LocationContext *LCtx=nullptr, const char *NL="\n", unsigned int Space=0, bool IsDot=false) const
iterator end() const
Definition Environment.h:71
iterator begin() const
Definition Environment.h:70
BindingsTy::iterator iterator
Definition Environment.h:68
SVal - This represents a symbolic expression, which can be either an L-value or an R-value.
Definition SVals.h:56
A class responsible for cleaning up unused symbols.
IntrusiveRefCntPtr< const ProgramState > ProgramStateRef
The JSON file list parser is used to communicate input to InstallAPI.