AnalysisBasedWarnings.h revision df7bef07eebd5c7913e8be09c62a6a470f255fd2
1//=- AnalysisBasedWarnings.h - Sema warnings based on libAnalysis -*- C++ -*-=//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines AnalysisBasedWarnings, a worker object used by Sema
11// that issues warnings based on dataflow-analysis.
12//===----------------------------------------------------------------------===//
13
14#ifndef LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
15#define LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
16
17#include "llvm/ADT/DenseMap.h"
18
19namespace clang {
20
21class BlockExpr;
22class Decl;
23class FunctionDecl;
24class ObjCMethodDecl;
25class QualType;
26class Sema;
27namespace sema {
28  class FunctionScopeInfo;
29}
30
31namespace sema {
32
33class AnalysisBasedWarnings {
34public:
35  class Policy {
36    friend class AnalysisBasedWarnings;
37    // The warnings to run.
38    unsigned enableCheckFallThrough : 1;
39    unsigned enableCheckUnreachable : 1;
40    unsigned enableThreadSafetyAnalysis : 1;
41    unsigned enableConsumedAnalysis : 1;
42  public:
43    Policy();
44    void disableCheckFallThrough() { enableCheckFallThrough = 0; }
45  };
46
47private:
48  Sema &S;
49  Policy DefaultPolicy;
50
51  enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
52  llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
53
54  /// \name Statistics
55  /// @{
56
57  /// \brief Number of function CFGs built and analyzed.
58  unsigned NumFunctionsAnalyzed;
59
60  /// \brief Number of functions for which the CFG could not be successfully
61  /// built.
62  unsigned NumFunctionsWithBadCFGs;
63
64  /// \brief Total number of blocks across all CFGs.
65  unsigned NumCFGBlocks;
66
67  /// \brief Largest number of CFG blocks for a single function analyzed.
68  unsigned MaxCFGBlocksPerFunction;
69
70  /// \brief Total number of CFGs with variables analyzed for uninitialized
71  /// uses.
72  unsigned NumUninitAnalysisFunctions;
73
74  /// \brief Total number of variables analyzed for uninitialized uses.
75  unsigned NumUninitAnalysisVariables;
76
77  /// \brief Max number of variables analyzed for uninitialized uses in a single
78  /// function.
79  unsigned MaxUninitAnalysisVariablesPerFunction;
80
81  /// \brief Total number of block visits during uninitialized use analysis.
82  unsigned NumUninitAnalysisBlockVisits;
83
84  /// \brief Max number of block visits during uninitialized use analysis of
85  /// a single function.
86  unsigned MaxUninitAnalysisBlockVisitsPerFunction;
87
88  /// @}
89
90public:
91  AnalysisBasedWarnings(Sema &s);
92
93  void IssueWarnings(Policy P, FunctionScopeInfo *fscope,
94                     const Decl *D, const BlockExpr *blkExpr);
95
96  Policy getDefaultPolicy() { return DefaultPolicy; }
97
98  void PrintStats() const;
99};
100
101}} // end namespace clang::sema
102
103#endif
104