Coverage Report

Created: 2021-01-19 06:58

/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/Analysis/Analyses/CalledOnceCheck.h
Line
Count
Source (jump to first uncovered line)
1
//===- CalledOnceCheck.h - Check 'called once' parameters -------*- 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 a check for function-like parameters that should be
10
//  called exactly one time.
11
//
12
//===----------------------------------------------------------------------===//
13
14
#ifndef LLVM_CLANG_ANALYSIS_ANALYSES_CALLEDONCECHECK_H
15
#define LLVM_CLANG_ANALYSIS_ANALYSES_CALLEDONCECHECK_H
16
17
namespace clang {
18
19
class AnalysisDeclContext;
20
class CFG;
21
class Decl;
22
class DeclContext;
23
class Expr;
24
class ParmVarDecl;
25
class Stmt;
26
27
/// Classification of situations when parameter is not called on every path.
28
/// \enum IfThen -- then branch of the if statement has no call.
29
/// \enum IfElse -- else branch of the if statement has no call.
30
/// \enum Switch -- one of the switch cases doesn't have a call.
31
/// \enum SwitchSkipped -- there is no call if none of the cases appies.
32
/// \enum LoopEntered -- no call when the loop is entered.
33
/// \enum LoopSkipped -- no call when the loop is not entered.
34
/// \enum FallbackReason -- fallback case when we were not able to figure out
35
/// the reason.
36
enum class NeverCalledReason {
37
  IfThen,
38
  IfElse,
39
  Switch,
40
  SwitchSkipped,
41
  LoopEntered,
42
  LoopSkipped,
43
  FallbackReason,
44
  LARGEST_VALUE = FallbackReason
45
};
46
47
class CalledOnceCheckHandler {
48
public:
49
24.9k
  CalledOnceCheckHandler() = default;
50
24.9k
  virtual ~CalledOnceCheckHandler() = default;
51
52
  /// Called when parameter is called twice.
53
  /// \param Parameter -- parameter that should be called once.
54
  /// \param Call -- call to report the warning.
55
  /// \param PrevCall -- previous call.
56
  /// \param IsCompletionHandler -- true, if parameter is a completion handler.
57
  /// \param Poised -- true, if the second call is guaranteed to happen after
58
  /// the first call.
59
  virtual void handleDoubleCall(const ParmVarDecl *Parameter, const Expr *Call,
60
                                const Expr *PrevCall, bool IsCompletionHandler,
61
0
                                bool Poised) {}
62
63
  /// Called when parameter is not called at all.
64
  /// \param Parameter -- parameter that should be called once.
65
  /// \param IsCompletionHandler -- true, if parameter is a completion handler.
66
  virtual void handleNeverCalled(const ParmVarDecl *Parameter,
67
0
                                 bool IsCompletionHandler) {}
68
69
  /// Called when captured parameter is not called at all.
70
  /// \param Parameter -- parameter that should be called once.
71
  /// \param Where -- declaration that captures \p Parameter
72
  /// \param IsCompletionHandler -- true, if parameter is a completion handler.
73
  virtual void handleCapturedNeverCalled(const ParmVarDecl *Parameter,
74
                                         const Decl *Where,
75
0
                                         bool IsCompletionHandler) {}
76
77
  /// Called when parameter is not called on one of the paths.
78
  /// Usually we try to find a statement that is the least common ancestor of
79
  /// the path containing the call and not containing the call.  This helps us
80
  /// to pinpoint a bad path for the user.
81
  /// \param Parameter -- parameter that should be called once.
82
  /// \param Where -- the least common ancestor statement.
83
  /// \param Reason -- a reason describing the path without a call.
84
  /// \param IsCalledDirectly -- true, if parameter actually gets called on
85
  /// the other path.  It is opposed to be used in some other way (added to some
86
  /// collection, passed as a parameter, etc.).
87
  /// \param IsCompletionHandler -- true, if parameter is a completion handler.
88
  virtual void handleNeverCalled(const ParmVarDecl *Parameter,
89
                                 const Stmt *Where, NeverCalledReason Reason,
90
                                 bool IsCalledDirectly,
91
0
                                 bool IsCompletionHandler) {}
92
};
93
94
/// Check given CFG for 'called once' parameter violations.
95
///
96
/// It traverses the function and tracks how such parameters are used.
97
/// It detects two main violations:
98
///   * parameter is called twice
99
///   * parameter is not called
100
///
101
/// \param AC -- context.
102
/// \param Handler -- a handler for found violations.
103
/// \param CheckConventionalParameters -- true, if we want to check parameters
104
/// not explicitly marked as 'called once', but having the same requirements
105
/// according to conventions.
106
void checkCalledOnceParameters(AnalysisDeclContext &AC,
107
                               CalledOnceCheckHandler &Handler,
108
                               bool CheckConventionalParameters);
109
110
} // end namespace clang
111
112
#endif /* LLVM_CLANG_ANALYSIS_ANALYSES_CALLEDONCECHECK_H */