Home | History | Annotate | Download | only in Sema
      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_ANALYSISBASEDWARNINGS_H
     15 #define LLVM_CLANG_SEMA_ANALYSISBASEDWARNINGS_H
     16 
     17 #include "llvm/ADT/DenseMap.h"
     18 
     19 namespace clang {
     20 
     21 class BlockExpr;
     22 class Decl;
     23 class FunctionDecl;
     24 class ObjCMethodDecl;
     25 class QualType;
     26 class Sema;
     27 namespace sema {
     28   class FunctionScopeInfo;
     29 }
     30 
     31 namespace sema {
     32 
     33 class AnalysisBasedWarnings {
     34 public:
     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 
     47 private:
     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 
     90 public:
     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