clang
9.0.0
include
clang
Analysis
Analyses
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
"
14
#include "
clang/ASTMatchers/ASTMatchers.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.
23
class
ExprMutationAnalyzer
{
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,
47
llvm::ArrayRef<MutationFinder>
Finders,
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.
79
class
FunctionParmMutationAnalyzer
{
80
public
:
81
FunctionParmMutationAnalyzer
(
const
FunctionDecl
&Func,
ASTContext
&Context);
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::isMutated
bool isMutated(const Decl *Dec)
Definition:
ExprMutationAnalyzer.h:29
clang::FunctionDecl
Represents a function declaration or definition.
Definition:
Decl.h:1748
clang::FunctionParmMutationAnalyzer
Definition:
ExprMutationAnalyzer.h:79
AST.h
clang::Stmt
Stmt - This represents one statement.
Definition:
Stmt.h:66
clang::Decl
Decl - This represents one declaration (or definition), e.g.
Definition:
DeclBase.h:88
clang::ExprMutationAnalyzer::findPointeeMutation
const Stmt * findPointeeMutation(const Expr *Exp)
Definition:
ExprMutationAnalyzer.cpp:113
clang::ExprMutationAnalyzer
Analyzes whether any mutative operations are applied to an expression within a given statement...
Definition:
ExprMutationAnalyzer.h:23
clang::ParmVarDecl
Represents a parameter to a function.
Definition:
Decl.h:1564
clang::ASTContext
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
Definition:
ASTContext.h:154
clang::FunctionParmMutationAnalyzer::isMutated
bool isMutated(const ParmVarDecl *Parm)
Definition:
ExprMutationAnalyzer.h:83
ASTMatchers.h
llvm::ArrayRef
Definition:
LLVM.h:31
clang::ExprMutationAnalyzer::ExprMutationAnalyzer
ExprMutationAnalyzer(const Stmt &Stm, ASTContext &Context)
Definition:
ExprMutationAnalyzer.h:25
clang::ExprMutationAnalyzer::isPointeeMutated
bool isPointeeMutated(const Decl *Dec)
Definition:
ExprMutationAnalyzer.h:36
clang::Expr
This represents one expression.
Definition:
Expr.h:108
clang
Dataflow Directional Tag Classes.
Definition:
CFGReachabilityAnalysis.h:21
clang::ExprMutationAnalyzer::isPointeeMutated
bool isPointeeMutated(const Expr *Exp)
Definition:
ExprMutationAnalyzer.h:33
clang::ExprMutationAnalyzer::isMutated
bool isMutated(const Expr *Exp)
Definition:
ExprMutationAnalyzer.h:28
clang::ExprMutationAnalyzer::findMutation
const Stmt * findMutation(const Expr *Exp)
Definition:
ExprMutationAnalyzer.cpp:97
Generated on Thu Sep 19 2019 15:17:59 for clang by
1.8.13