clang  15.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  static bool isUnevaluated(const Stmt *Smt, const Stmt &Stm,
42  ASTContext &Context);
43 
44 private:
45  using MutationFinder = const Stmt *(ExprMutationAnalyzer::*)(const Expr *);
46  using ResultMap = llvm::DenseMap<const Expr *, const Stmt *>;
47 
48  const Stmt *findMutationMemoized(const Expr *Exp,
50  ResultMap &MemoizedResults);
51  const Stmt *tryEachDeclRef(const Decl *Dec, MutationFinder Finder);
52 
53  bool isUnevaluated(const Expr *Exp);
54 
55  const Stmt *findExprMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
56  const Stmt *findDeclMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
57  const Stmt *
58  findExprPointeeMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
59  const Stmt *
60  findDeclPointeeMutation(ArrayRef<ast_matchers::BoundNodes> Matches);
61 
62  const Stmt *findDirectMutation(const Expr *Exp);
63  const Stmt *findMemberMutation(const Expr *Exp);
64  const Stmt *findArrayElementMutation(const Expr *Exp);
65  const Stmt *findCastMutation(const Expr *Exp);
66  const Stmt *findRangeLoopMutation(const Expr *Exp);
67  const Stmt *findReferenceMutation(const Expr *Exp);
68  const Stmt *findFunctionArgMutation(const Expr *Exp);
69 
70  const Stmt &Stm;
71  ASTContext &Context;
72  llvm::DenseMap<const FunctionDecl *,
73  std::unique_ptr<FunctionParmMutationAnalyzer>>
74  FuncParmAnalyzer;
75  ResultMap Results;
76  ResultMap PointeeResults;
77 };
78 
79 // A convenient wrapper around ExprMutationAnalyzer for analyzing function
80 // params.
82 public:
84 
85  bool isMutated(const ParmVarDecl *Parm) {
86  return findMutation(Parm) != nullptr;
87  }
88  const Stmt *findMutation(const ParmVarDecl *Parm);
89 
90 private:
91  ExprMutationAnalyzer BodyAnalyzer;
92  llvm::DenseMap<const ParmVarDecl *, const Stmt *> Results;
93 };
94 
95 } // namespace clang
96 
97 #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:1680
clang::FunctionParmMutationAnalyzer::FunctionParmMutationAnalyzer
FunctionParmMutationAnalyzer(const FunctionDecl &Func, ASTContext &Context)
Definition: ExprMutationAnalyzer.cpp:597
clang::ExprMutationAnalyzer
Analyzes whether any mutative operations are applied to an expression within a given statement.
Definition: ExprMutationAnalyzer.h:23
clang::ExprMutationAnalyzer::isUnevaluated
static bool isUnevaluated(const Stmt *Smt, const Stmt &Stm, ASTContext &Context)
Definition: ExprMutationAnalyzer.cpp:202
clang::ASTContext
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition: ASTContext.h:208
ASTMatchers.h
clang::FunctionParmMutationAnalyzer
Definition: ExprMutationAnalyzer.h:81
clang::ExprMutationAnalyzer::findPointeeMutation
const Stmt * findPointeeMutation(const Expr *Exp)
Definition: ExprMutationAnalyzer.cpp:163
clang::ExprMutationAnalyzer::isMutated
bool isMutated(const Expr *Exp)
Definition: ExprMutationAnalyzer.h:28
clang::ExprMutationAnalyzer::findMutation
const Stmt * findMutation(const Expr *Exp)
Definition: ExprMutationAnalyzer.cpp:147
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:83
clang::FunctionParmMutationAnalyzer::findMutation
const Stmt * findMutation(const ParmVarDecl *Parm)
Definition: ExprMutationAnalyzer.cpp:616
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:85
clang::Stmt
Stmt - This represents one statement.
Definition: Stmt.h:70
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:1872
AST.h