clang API Documentation
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