clang  14.0.0git
ExprMutationAnalyzer.h
Go to the documentation of this file.
1 //===---------- ExprMutationAnalyzer.h ------------------------------------===//
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 #ifndef LLVM_CLANG_ANALYSIS_ANALYSES_EXPRMUTATIONANALYZER_H
9 #define LLVM_CLANG_ANALYSIS_ANALYSES_EXPRMUTATIONANALYZER_H
10 
11 #include <type_traits>
12 
13 #include "clang/AST/AST.h"
15 #include "llvm/ADT/DenseMap.h"
16 
17 namespace clang {
18 
19 class FunctionParmMutationAnalyzer;
20 
21 /// Analyzes whether any mutative operations are applied to an expression within
22 /// a given statement.
24 public:
25  ExprMutationAnalyzer(const Stmt &Stm, ASTContext &Context)
26  : Stm(Stm), Context(Context) {}
27 
28  bool isMutated(const Expr *Exp) { return findMutation(Exp) != nullptr; }
29  bool isMutated(const Decl *Dec) { return findMutation(Dec) != nullptr; }
30  const Stmt *findMutation(const Expr *Exp);
31  const Stmt *findMutation(const Decl *Dec);
32 
33  bool isPointeeMutated(const Expr *Exp) {
34  return findPointeeMutation(Exp) != nullptr;
35  }
36  bool isPointeeMutated(const Decl *Dec) {
37  return findPointeeMutation(Dec) != nullptr;
38  }
39  const Stmt *findPointeeMutation(const Expr *Exp);
40  const Stmt *findPointeeMutation(const Decl *Dec);
41 
42 private:
43  using MutationFinder = const Stmt *(ExprMutationAnalyzer::*)(const Expr *);
44  using ResultMap = llvm::DenseMap<const Expr *, const Stmt *>;
45 
46  const Stmt *findMutationMemoized(const Expr *Exp,
48  ResultMap &MemoizedResults);
49  const Stmt *tryEachDeclRef(const Decl *Dec, MutationFinder Finder);
50 
51  bool isUnevaluated(const Expr *Exp);
52 
53  const Stmt *findExprMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
54  const Stmt *findDeclMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
55  const Stmt *
56  findExprPointeeMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
57  const Stmt *
58  findDeclPointeeMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
59 
60  const Stmt *findDirectMutation(const Expr *Exp);
61  const Stmt *findMemberMutation(const Expr *Exp);
62  const Stmt *findArrayElementMutation(const Expr *Exp);
63  const Stmt *findCastMutation(const Expr *Exp);
64  const Stmt *findRangeLoopMutation(const Expr *Exp);
65  const Stmt *findReferenceMutation(const Expr *Exp);
66  const Stmt *findFunctionArgMutation(const Expr *Exp);
67 
68  const Stmt &Stm;
69  ASTContext &Context;
70  llvm::DenseMap<const FunctionDecl *,
71  std::unique_ptr<FunctionParmMutationAnalyzer>>
72  FuncParmAnalyzer;
73  ResultMap Results;
74  ResultMap PointeeResults;
75 };
76 
77 // A convenient wrapper around ExprMutationAnalyzer for analyzing function
78 // params.
80 public:
82 
83  bool isMutated(const ParmVarDecl *Parm) {
84  return findMutation(Parm) != nullptr;
85  }
86  const Stmt *findMutation(const ParmVarDecl *Parm);
87 
88 private:
89  ExprMutationAnalyzer BodyAnalyzer;
90  llvm::DenseMap<const ParmVarDecl *, const Stmt *> Results;
91 };
92 
93 } // namespace clang
94 
95 #endif // LLVM_CLANG_ANALYSIS_ANALYSES_EXPRMUTATIONANALYZER_H
clang::ExprMutationAnalyzer::isPointeeMutated
bool isPointeeMutated(const Decl *Dec)
Definition: ExprMutationAnalyzer.h:36
clang::ParmVarDecl
Represents a parameter to a function.
Definition: Decl.h:1665
clang::FunctionParmMutationAnalyzer::FunctionParmMutationAnalyzer
FunctionParmMutationAnalyzer(const FunctionDecl &Func, ASTContext &Context)
Definition: ExprMutationAnalyzer.cpp:587
clang::ExprMutationAnalyzer
Analyzes whether any mutative operations are applied to an expression within a given statement.
Definition: ExprMutationAnalyzer.h:23
clang::ASTContext
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:212
ASTMatchers.h
clang::FunctionParmMutationAnalyzer
Definition: ExprMutationAnalyzer.h:79
clang::ExprMutationAnalyzer::findPointeeMutation
const Stmt * findPointeeMutation(const Expr *Exp)
Definition: ExprMutationAnalyzer.cpp:158
clang::ExprMutationAnalyzer::isMutated
bool isMutated(const Expr *Exp)
Definition: ExprMutationAnalyzer.h:28
clang::ExprMutationAnalyzer::findMutation
const Stmt * findMutation(const Expr *Exp)
Definition: ExprMutationAnalyzer.cpp:142
clang::ExprMutationAnalyzer::isPointeeMutated
bool isPointeeMutated(const Expr *Exp)
Definition: ExprMutationAnalyzer.h:33
llvm::ArrayRef
Definition: LLVM.h:34
clang::Decl
Decl - This represents one declaration (or definition), e.g.
Definition: DeclBase.h:89
clang::FunctionParmMutationAnalyzer::findMutation
const Stmt * findMutation(const ParmVarDecl *Parm)
Definition: ExprMutationAnalyzer.cpp:606
clang::ExprMutationAnalyzer::ExprMutationAnalyzer
ExprMutationAnalyzer(const Stmt &Stm, ASTContext &Context)
Definition: ExprMutationAnalyzer.h:25
clang
Definition: CalledOnceCheck.h:17
clang::FunctionParmMutationAnalyzer::isMutated
bool isMutated(const ParmVarDecl *Parm)
Definition: ExprMutationAnalyzer.h:83
clang::Stmt
Stmt - This represents one statement.
Definition: Stmt.h:69
clang::ExprMutationAnalyzer::isMutated
bool isMutated(const Decl *Dec)
Definition: ExprMutationAnalyzer.h:29
clang::Expr
This represents one expression.
Definition: Expr.h:109
clang::FunctionDecl
Represents a function declaration or definition.
Definition: Decl.h:1856
AST.h