diff options
Diffstat (limited to 'include/clang/StaticAnalyzer/Core/CheckerManager.h')
-rw-r--r-- | include/clang/StaticAnalyzer/Core/CheckerManager.h | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/include/clang/StaticAnalyzer/Core/CheckerManager.h b/include/clang/StaticAnalyzer/Core/CheckerManager.h index 8ad67c118f01..b364115c99b6 100644 --- a/include/clang/StaticAnalyzer/Core/CheckerManager.h +++ b/include/clang/StaticAnalyzer/Core/CheckerManager.h @@ -16,8 +16,8 @@ #include "clang/Analysis/ProgramPoint.h" #include "clang/Basic/LangOptions.h" -#include "clang/StaticAnalyzer/Core/PathSensitive/Store.h" #include "clang/StaticAnalyzer/Core/AnalyzerOptions.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/Store.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/SmallVector.h" #include <vector> @@ -29,11 +29,11 @@ namespace clang { namespace ento { class CheckerBase; + class CheckerRegistry; class ExprEngine; class AnalysisManager; class BugReporter; class CheckerContext; - class SimpleCall; class ObjCMethodCall; class SVal; class ExplodedNode; @@ -132,9 +132,26 @@ enum PointerEscapeKind { PSK_EscapeOther }; +// This wrapper is used to ensure that only StringRefs originating from the +// CheckerRegistry are used as check names. We want to make sure all check +// name strings have a lifetime that keeps them alive at least until the path +// diagnostics have been processed. +class CheckName { + StringRef Name; + friend class ::clang::ento::CheckerRegistry; + explicit CheckName(StringRef Name) : Name(Name) {} + +public: + CheckName() {} + CheckName(const CheckName &Other) : Name(Other.Name) {} + StringRef getName() const { return Name; } +}; + class CheckerManager { const LangOptions LangOpts; AnalyzerOptionsRef AOptions; + CheckName CurrentCheckName; + public: CheckerManager(const LangOptions &langOpts, AnalyzerOptionsRef AOptions) @@ -143,6 +160,9 @@ public: ~CheckerManager(); + void setCurrentCheckName(CheckName name) { CurrentCheckName = name; } + CheckName getCurrentCheckName() const { return CurrentCheckName; } + bool hasPathSensitiveCheckers() const; void finishedCheckerRegistration(); @@ -169,6 +189,7 @@ public: return static_cast<CHECKER *>(ref); // already registered. CHECKER *checker = new CHECKER(); + checker->Name = CurrentCheckName; CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>)); CHECKER::_register(checker, *this); ref = checker; @@ -183,6 +204,7 @@ public: return static_cast<CHECKER *>(ref); // already registered. CHECKER *checker = new CHECKER(AOpts); + checker->Name = CurrentCheckName; CheckerDtors.push_back(CheckerDtor(checker, destruct<CHECKER>)); CHECKER::_register(checker, *this); ref = checker; |