AnalysisBasedWarnings.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. #pragma once
  2. #ifdef __GNUC__
  3. #pragma GCC diagnostic push
  4. #pragma GCC diagnostic ignored "-Wunused-parameter"
  5. #endif
  6. //=- AnalysisBasedWarnings.h - Sema warnings based on libAnalysis -*- C++ -*-=//
  7. //
  8. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  9. // See https://llvm.org/LICENSE.txt for license information.
  10. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  11. //
  12. //===----------------------------------------------------------------------===//
  13. //
  14. // This file defines AnalysisBasedWarnings, a worker object used by Sema
  15. // that issues warnings based on dataflow-analysis.
  16. //===----------------------------------------------------------------------===//
  17. #ifndef LLVM_CLANG_SEMA_ANALYSISBASEDWARNINGS_H
  18. #define LLVM_CLANG_SEMA_ANALYSISBASEDWARNINGS_H
  19. #include "llvm/ADT/DenseMap.h"
  20. #include <memory>
  21. namespace clang {
  22. class Decl;
  23. class FunctionDecl;
  24. class QualType;
  25. class Sema;
  26. namespace sema {
  27. class FunctionScopeInfo;
  28. }
  29. namespace sema {
  30. class AnalysisBasedWarnings {
  31. public:
  32. class Policy {
  33. friend class AnalysisBasedWarnings;
  34. // The warnings to run.
  35. unsigned enableCheckFallThrough : 1;
  36. unsigned enableCheckUnreachable : 1;
  37. unsigned enableThreadSafetyAnalysis : 1;
  38. unsigned enableConsumedAnalysis : 1;
  39. public:
  40. Policy();
  41. void disableCheckFallThrough() { enableCheckFallThrough = 0; }
  42. };
  43. private:
  44. Sema &S;
  45. Policy DefaultPolicy;
  46. class InterProceduralData;
  47. std::unique_ptr<InterProceduralData> IPData;
  48. enum VisitFlag { NotVisited = 0, Visited = 1, Pending = 2 };
  49. llvm::DenseMap<const FunctionDecl*, VisitFlag> VisitedFD;
  50. /// \name Statistics
  51. /// @{
  52. /// Number of function CFGs built and analyzed.
  53. unsigned NumFunctionsAnalyzed;
  54. /// Number of functions for which the CFG could not be successfully
  55. /// built.
  56. unsigned NumFunctionsWithBadCFGs;
  57. /// Total number of blocks across all CFGs.
  58. unsigned NumCFGBlocks;
  59. /// Largest number of CFG blocks for a single function analyzed.
  60. unsigned MaxCFGBlocksPerFunction;
  61. /// Total number of CFGs with variables analyzed for uninitialized
  62. /// uses.
  63. unsigned NumUninitAnalysisFunctions;
  64. /// Total number of variables analyzed for uninitialized uses.
  65. unsigned NumUninitAnalysisVariables;
  66. /// Max number of variables analyzed for uninitialized uses in a single
  67. /// function.
  68. unsigned MaxUninitAnalysisVariablesPerFunction;
  69. /// Total number of block visits during uninitialized use analysis.
  70. unsigned NumUninitAnalysisBlockVisits;
  71. /// Max number of block visits during uninitialized use analysis of
  72. /// a single function.
  73. unsigned MaxUninitAnalysisBlockVisitsPerFunction;
  74. /// @}
  75. public:
  76. AnalysisBasedWarnings(Sema &s);
  77. ~AnalysisBasedWarnings();
  78. void IssueWarnings(Policy P, FunctionScopeInfo *fscope,
  79. const Decl *D, QualType BlockType);
  80. Policy getDefaultPolicy() { return DefaultPolicy; }
  81. void PrintStats() const;
  82. };
  83. } // namespace sema
  84. } // namespace clang
  85. #endif
  86. #ifdef __GNUC__
  87. #pragma GCC diagnostic pop
  88. #endif