From: Nico Weber Date: Wed, 7 May 2014 21:28:03 +0000 (+0000) Subject: NSOrCFErrorDerefChecker: Don't leak bug type. Similar to r208110/r208155. Found by... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3e4763c6e533a1e34ea1440b11f85385bd0e2ec;p=clang NSOrCFErrorDerefChecker: Don't leak bug type. Similar to r208110/r208155. Found by LSan. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208251 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp b/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp index 5a505fcef8..5c4b993f5b 100644 --- a/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp @@ -153,6 +153,8 @@ class NSOrCFErrorDerefChecker : public Checker< check::Location, check::Event > { mutable IdentifierInfo *NSErrorII, *CFErrorII; + mutable std::unique_ptr NSBT; + mutable std::unique_ptr CFBT; public: bool ShouldCheckNSError, ShouldCheckCFError; NSOrCFErrorDerefChecker() : NSErrorII(0), CFErrorII(0), @@ -263,10 +265,16 @@ void NSOrCFErrorDerefChecker::checkEvent(ImplicitNullDerefEvent event) const { os << " may be null"; BugType *bug = 0; - if (isNSError) - bug = new NSErrorDerefBug(this); - else - bug = new CFErrorDerefBug(this); + if (isNSError) { + if (!NSBT) + NSBT.reset(new NSErrorDerefBug(this)); + bug = NSBT.get(); + } + else { + if (!CFBT) + CFBT.reset(new CFErrorDerefBug(this)); + bug = CFBT.get(); + } BugReport *report = new BugReport(*bug, os.str(), event.SinkNode); BR.emitReport(report); }