clang 24.0.0git
FactsGenerator.h
Go to the documentation of this file.
1//===- FactsGenerator.h - Lifetime Facts Generation -------------*- 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 defines the FactsGenerator, which traverses the AST to generate
10// lifetime-relevant facts (such as loan issuance, expiration, origin flow,
11// and use) from CFG statements. These facts are used by the dataflow analyses
12// to track pointer lifetimes and detect use-after-free errors.
13//
14//===----------------------------------------------------------------------===//
15#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_FACTSGENERATOR_H
16#define LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_FACTSGENERATOR_H
17
23#include "clang/Analysis/CFG.h"
24#include "llvm/ADT/DenseMap.h"
25#include "llvm/ADT/SmallVector.h"
26
28
29class FactsGenerator : public ConstStmtVisitor<FactsGenerator> {
31
32public:
34 const LifetimeSafetyOpts &LSOpts)
35 : FactMgr(FactMgr), AC(AC), LSOpts(LSOpts),
36 IsCMode(!AC.getASTContext().getLangOpts().CPlusPlus &&
37 !AC.getASTContext().getLangOpts().ObjC) {}
38
39 void run();
40
41 void VisitDeclStmt(const DeclStmt *DS);
42 void VisitDeclRefExpr(const DeclRefExpr *DRE);
46 void VisitMemberExpr(const MemberExpr *ME);
47 void VisitCallExpr(const CallExpr *CE);
49 void VisitCastExpr(const CastExpr *CE);
50 void VisitUnaryOperator(const UnaryOperator *UO);
51 void VisitReturnStmt(const ReturnStmt *RS);
52 void VisitBinaryOperator(const BinaryOperator *BO);
56 void VisitInitListExpr(const InitListExpr *ILE);
59 void VisitLambdaExpr(const LambdaExpr *LE);
61 void VisitCXXNewExpr(const CXXNewExpr *NE);
62 void VisitCXXDeleteExpr(const CXXDeleteExpr *DE);
63 void VisitCXXThrowExpr(const CXXThrowExpr *TE);
64 void VisitGCCAsmStmt(const GCCAsmStmt *AS);
65 void VisitCXXTypeidExpr(const CXXTypeidExpr *TE);
66 void VisitStmtExpr(const StmtExpr *SE);
67
68private:
69 OriginList *getOriginsList(const ValueDecl &D);
70 OriginList *getOriginsList(const Expr &E);
71
72 bool hasOrigins(QualType QT) const;
73 bool hasOrigins(const Expr *E) const;
74
75 void flow(OriginList *Dst, OriginList *Src, bool Kill,
76 const CFGBlock *Block = nullptr);
77
78 /// Handles assignment for both BinaryOperator and CXXOperatorCallExpr.
79 ///
80 /// LHSExpr is the destination whose stored loans are replaced by RHSExpr's
81 /// loans. TargetExpr is the assignment expression itself; it receives
82 /// LHSExpr's origins so chained assignments like `a = b = c` can propagate
83 /// through the result of `b = c`.
84 void handleAssignment(const Expr *TargetExpr, const Expr *LHSExpr,
85 const Expr *RHSExpr);
86
87 void handlePointerArithmetic(const BinaryOperator *BO);
88
89 bool handlePlacementNew(const CXXNewExpr *NE, OriginList *NewList);
90
91 void handleCXXCtorInitializer(const CXXCtorInitializer *CII);
92
93 void handleLifetimeEnds(const CFGLifetimeEnds &LifetimeEnds);
94
95 void handleFullExprCleanup(const CFGFullExprCleanup &FullExprCleanup);
96
97 void handleExitBlock();
98
99 /// Mark all fields of the implicit object as used for an instance method
100 /// call, since the callee may access any part of the object.
101 void handleImplicitObjectFieldUses(const Expr *Call, const FunctionDecl *FD);
102
103 void handleGSLPointerConstruction(const CXXConstructExpr *CCE);
104
105 /// Detects arguments passed to rvalue reference parameters and creates
106 /// MovedOriginFact for them. The MovedLoansAnalysis then uses these facts
107 /// to track in a flow-sensitive manner which loans have been moved at each
108 /// program point, allowing warnings to distinguish potentially moved storage
109 /// from other use-after-free errors.
110 void handleMovedArgsInCall(const FunctionDecl *FD,
112
113 // Handles [[clang::lifetime_capture_by(X)]] annotations on a function call to
114 // create flow facts from captured arguments to the capturer
115 void handleLifetimeCaptureBy(const FunctionDecl *FD,
117
118 /// Checks if a call-like expression creates a borrow by passing a value to a
119 /// reference parameter, creating an IssueFact if it does.
120 /// \param IsGslConstruction True if this is a GSL construction where all
121 /// argument origins should flow to the returned origin.
122 void handleFunctionCall(const Expr *Call, bool IsGslConstruction = false);
123
124 // Detect methods that invalidate iterators/references/pointees.
125 // For instance methods, Args[0] is the implicit 'this' pointer.
126 void handleInvalidatingCall(const Expr *Call, const FunctionDecl *FD,
128
129 // Detect explicit destructor calls/`std::destroy_at`
130 void handleDestructiveCall(const Expr *Call, const FunctionDecl *FD,
132
133 template <typename Destination, typename Source>
134 void flowOrigin(const Destination &D, const Source &S) {
135 flow(getOriginsList(D), getOriginsList(S), /*Kill=*/false);
136 }
137
138 template <typename Destination, typename Source>
139 void killAndFlowOrigin(const Destination &D, const Source &S) {
140 flow(getOriginsList(D), getOriginsList(S), /*Kill=*/true);
141 }
142
143 /// Checks if the expression is a `void("__lifetime_test_point_...")` cast.
144 /// If so, creates a `TestPointFact` and returns true.
145 bool handleTestPoint(const CXXFunctionalCastExpr *FCE);
146
147 /// Whether \p List's outer origin names a declaration's storage outright, so
148 /// it can never hold an expired loan (see Origin::NamesDeclStorage).
149 bool namesDeclStorage(const OriginList *List) const;
150
151 /// Returns the origins of the value \p E evaluates to, recording the read of
152 /// a glvalue. Callers that write to \p E peel the outer origin themselves.
153 ///
154 /// Example: For `View& v`, returns the origin of what v points to, not v's
155 /// storage.
156 OriginList *readValue(const Expr *E);
157
158 /// Records an access (read or write) of the storage \p E designates, or that
159 /// a prvalue pointer \p E points to.
160 void handleAccess(const Expr *E);
161
162 /// Records that \p E's value is handed to opaque code, which may dereference
163 /// it to any depth.
164 void handleUse(const Expr *E);
165
166 bool escapesViaReturn(OriginID OID) const;
167
168 llvm::SmallVector<Fact *> issuePlaceholderLoans();
169 void issueFieldPlaceholderLoans(const CXXRecordDecl *ClassDef,
171 FactManager &FactMgr;
173 const LifetimeSafetyOpts &LSOpts;
174 llvm::SmallVector<Fact *> CurrentBlockFacts;
175 // Collect origins that escape the function in this block (OriginEscapesFact),
176 // appended at the end of CurrentBlockFacts to ensure they appear after
177 // ExpireFact entries.
178 llvm::SmallVector<Fact *> EscapesInCurrentBlock;
179 // Lifetime-extended temporaries, keyed by the variable they expire with.
180 llvm::DenseMap<const ValueDecl *,
182 ExtendedTemporaries;
183 const CFGBlock *CurrentBlock;
184 bool IsCMode = false;
185};
186
187} // namespace clang::lifetimes::internal
188
189#endif // LLVM_CLANG_ANALYSIS_ANALYSES_LIFETIMESAFETY_FACTSGENERATOR_H
This file defines AnalysisDeclContext, a class that manages the analysis context data for context sen...
static bool handleAssignment(EvalInfo &Info, const Expr *E, const LValue &LVal, QualType LValType, APValue &Val)
Perform an assignment of Val to LVal. Takes ownership of Val.
AbstractConditionalOperator - An abstract base class for ConditionalOperator and BinaryConditionalOpe...
Definition Expr.h:4422
AnalysisDeclContext contains the context data for the function, method or block under analysis.
ArraySubscriptExpr - [C99 6.5.2.1] Array Subscripting.
Definition Expr.h:2790
A builtin binary operation expression such as "x + y" or "x <= y".
Definition Expr.h:4107
Represents a single basic block in a source-level CFG.
Definition CFG.h:651
Represents the point where the lifetime of an automatic object ends.
Definition CFG.h:321
Represents binding an expression to a temporary.
Definition ExprCXX.h:1498
Represents a call to a C++ constructor.
Definition ExprCXX.h:1553
Represents a C++ base or member initializer.
Definition DeclCXX.h:2407
A use of a default initializer in a constructor or in aggregate initialization.
Definition ExprCXX.h:1382
Represents a delete expression for memory deallocation and destructor calls, e.g.
Definition ExprCXX.h:2631
Represents an explicit C++ type conversion that uses "functional" notation (C++ [expr....
Definition ExprCXX.h:1836
Represents a call to a member function that may be written either with member call syntax (e....
Definition ExprCXX.h:184
Represents a new-expression for memory allocation and constructor calls, e.g: "new CXXNewExpr(foo)".
Definition ExprCXX.h:2360
The null pointer literal (C++11 [lex.nullptr])
Definition ExprCXX.h:773
A call to an overloaded operator written using operator syntax.
Definition ExprCXX.h:86
Represents a C++ struct/union/class.
Definition DeclCXX.h:258
A C++ throw-expression (C++ [except.throw]).
Definition ExprCXX.h:1213
A C++ typeid expression (C++ [expr.typeid]), which gets the type_info that corresponds to the supplie...
Definition ExprCXX.h:853
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Definition Expr.h:3012
CastExpr - Base class for type casts, including both implicit casts (ImplicitCastExpr) and explicit c...
Definition Expr.h:3745
ConstStmtVisitor - This class implements a simple visitor for Stmt subclasses.
A reference to a declared variable, function, enum, etc.
Definition Expr.h:1315
DeclStmt - Adaptor class for mixing declarations with statements and expressions.
Definition Stmt.h:1642
This represents one expression.
Definition Expr.h:114
Represents a function declaration or definition.
Definition Decl.h:2071
This represents a GCC inline-assembly statement extension.
Definition Stmt.h:3459
Describes an C or C++ initializer list.
Definition Expr.h:5377
A C++ lambda expression, which produces a function object (of unspecified type) that can be invoked l...
Definition ExprCXX.h:1973
Represents a prvalue temporary that is written into memory so that a reference can bind to it.
Definition ExprCXX.h:4974
MemberExpr - [C99 6.5.2.3] Structure and Union Members.
Definition Expr.h:3433
A (possibly-)qualified type.
Definition TypeBase.h:938
ReturnStmt - This represents a return, optionally of an expression: return; return 4;.
Definition Stmt.h:3173
StmtExpr - This is the GNU Statement Expression extension: ({int X=4; X;}).
Definition Expr.h:4664
UnaryOperator - This represents the unary-expression's (except sizeof and alignof),...
Definition Expr.h:2313
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
Definition Decl.h:714
void VisitDeclRefExpr(const DeclRefExpr *DRE)
void VisitBinaryOperator(const BinaryOperator *BO)
void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *MTE)
void VisitCXXConstructExpr(const CXXConstructExpr *CCE)
void VisitCXXTypeidExpr(const CXXTypeidExpr *TE)
FactsGenerator(FactManager &FactMgr, AnalysisDeclContext &AC, const LifetimeSafetyOpts &LSOpts)
void VisitAbstractConditionalOperator(const AbstractConditionalOperator *CO)
Visits conditional operators (e.g., cond ?
void VisitCXXDeleteExpr(const CXXDeleteExpr *DE)
void VisitCXXFunctionalCastExpr(const CXXFunctionalCastExpr *FCE)
void VisitCXXDefaultInitExpr(const CXXDefaultInitExpr *DIE)
void VisitInitListExpr(const InitListExpr *ILE)
void VisitCXXNullPtrLiteralExpr(const CXXNullPtrLiteralExpr *N)
void VisitCXXOperatorCallExpr(const CXXOperatorCallExpr *OCE)
void VisitArraySubscriptExpr(const ArraySubscriptExpr *ASE)
void VisitUnaryOperator(const UnaryOperator *UO)
void VisitCXXThrowExpr(const CXXThrowExpr *TE)
void VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE)
void VisitCXXBindTemporaryExpr(const CXXBindTemporaryExpr *BTE)
A list of origins representing levels of indirection for pointer-like types.
Definition Origins.h:105
utils::ID< struct OriginTag > OriginID
Definition Origins.h:28
@ CPlusPlus