clang API Documentation

AnalysisBasedWarnings.h
Go to the documentation of this file.
00001 //=- AnalysisBasedWarnings.h - Sema warnings based on libAnalysis -*- C++ -*-=//
00002 //
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file is distributed under the University of Illinois Open Source
00006 // License. See LICENSE.TXT for details.
00007 //
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file defines AnalysisBasedWarnings, a worker object used by Sema
00011 // that issues warnings based on dataflow-analysis.
00012 //===----------------------------------------------------------------------===//
00013 
00014 #ifndef LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
00015 #define LLVM_CLANG_SEMA_ANALYSIS_WARNINGS_H
00016 
00017 #include "llvm/ADT/DenseMap.h"
00018 
00019 namespace clang {
00020 
00021 class BlockExpr;
00022 class Decl;
00023 class FunctionDecl;
00024 class ObjCMethodDecl;
00025 class QualType;
00026 class Sema;
00027 namespace sema {
00028   class FunctionScopeInfo;
00029 }
00030 
00031 namespace sema {
00032 
00033 class AnalysisBasedWarnings {
00034 public:
00035   class Policy {
00036     friend class AnalysisBasedWarnings;
00037     // The warnings to run.
00038     unsigned enableCheckFallThrough : 1;
00039     unsigned enableCheckUnreachable : 1;
00040     unsigned enableThreadSafetyAnalysis : 1;
00041   public:
00042     Policy();
00043     void disableCheckFallThrough() { enableCheckFallThrough = 0; }
00044   };
00045 
00046 private:
00047   Sema &S;
00048   Policy DefaultPolicy;
00049 
00050   enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
00051   llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
00052 
00053   /// \name Statistics
00054   /// @{
00055 
00056   /// \brief Number of function CFGs built and analyzed.
00057   unsigned NumFunctionsAnalyzed;
00058 
00059   /// \brief Number of functions for which the CFG could not be successfully
00060   /// built.
00061   unsigned NumFunctionsWithBadCFGs;
00062 
00063   /// \brief Total number of blocks across all CFGs.
00064   unsigned NumCFGBlocks;
00065 
00066   /// \brief Largest number of CFG blocks for a single function analyzed.
00067   unsigned MaxCFGBlocksPerFunction;
00068 
00069   /// \brief Total number of CFGs with variables analyzed for uninitialized
00070   /// uses.
00071   unsigned NumUninitAnalysisFunctions;
00072 
00073   /// \brief Total number of variables analyzed for uninitialized uses.
00074   unsigned NumUninitAnalysisVariables;
00075 
00076   /// \brief Max number of variables analyzed for uninitialized uses in a single
00077   /// function.
00078   unsigned MaxUninitAnalysisVariablesPerFunction;
00079 
00080   /// \brief Total number of block visits during uninitialized use analysis.
00081   unsigned NumUninitAnalysisBlockVisits;
00082 
00083   /// \brief Max number of block visits during uninitialized use analysis of
00084   /// a single function.
00085   unsigned MaxUninitAnalysisBlockVisitsPerFunction;
00086 
00087   /// @}
00088 
00089 public:
00090   AnalysisBasedWarnings(Sema &s);
00091 
00092   void IssueWarnings(Policy P, FunctionScopeInfo *fscope,
00093                      const Decl *D, const BlockExpr *blkExpr);
00094 
00095   Policy getDefaultPolicy() { return DefaultPolicy; }
00096 
00097   void PrintStats() const;
00098 };
00099 
00100 }} // end namespace clang::sema
00101 
00102 #endif