1 //== RetainCountDiagnostics.h - Checks for leaks and other issues -*- C++ -*--// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines diagnostics for RetainCountChecker, which implements 10 // a reference count checker for Core Foundation and Cocoa on (Mac OS X). 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_RETAINCOUNTCHECKER_DIAGNOSTICS_H 15 #define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_RETAINCOUNTCHECKER_DIAGNOSTICS_H 16 17 #include "clang/Analysis/PathDiagnostic.h" 18 #include "clang/Analysis/RetainSummaryManager.h" 19 #include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" 20 #include "clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h" 21 #include "clang/StaticAnalyzer/Core/PathSensitive/CallEvent.h" 22 23 namespace clang { 24 namespace ento { 25 namespace retaincountchecker { 26 27 class RefCountBug : public BugType { 28 public: 29 enum RefCountBugType { 30 UseAfterRelease, 31 ReleaseNotOwned, 32 DeallocNotOwned, 33 FreeNotOwned, 34 OverAutorelease, 35 ReturnNotOwnedForOwned, 36 LeakWithinFunction, 37 LeakAtReturn, 38 }; 39 RefCountBug(const CheckerBase *checker, RefCountBugType BT); 40 StringRef getDescription() const; 41 42 RefCountBugType getBugType() const { 43 return BT; 44 } 45 46 const CheckerBase *getChecker() const { 47 return Checker; 48 } 49 50 private: 51 RefCountBugType BT; 52 const CheckerBase *Checker; 53 static StringRef bugTypeToName(RefCountBugType BT); 54 }; 55 56 class RefCountReport : public PathSensitiveBugReport { 57 protected: 58 SymbolRef Sym; 59 bool isLeak = false; 60 61 public: 62 RefCountReport(const RefCountBug &D, const LangOptions &LOpts, 63 ExplodedNode *n, SymbolRef sym, 64 bool isLeak=false); 65 66 RefCountReport(const RefCountBug &D, const LangOptions &LOpts, 67 ExplodedNode *n, SymbolRef sym, 68 StringRef endText); 69 70 ArrayRef<SourceRange> getRanges() const override { 71 if (!isLeak) 72 return PathSensitiveBugReport::getRanges(); 73 return {}; 74 } 75 }; 76 77 class RefLeakReport : public RefCountReport { 78 const MemRegion* AllocBinding; 79 const Stmt *AllocStmt; 80 PathDiagnosticLocation Location; 81 82 // Finds the function declaration where a leak warning for the parameter 83 // 'sym' should be raised. 84 void deriveParamLocation(CheckerContext &Ctx, SymbolRef sym); 85 // Finds the location where a leak warning for 'sym' should be raised. 86 void deriveAllocLocation(CheckerContext &Ctx, SymbolRef sym); 87 // Produces description of a leak warning which is printed on the console. 88 void createDescription(CheckerContext &Ctx); 89 90 public: 91 RefLeakReport(const RefCountBug &D, const LangOptions &LOpts, ExplodedNode *n, 92 SymbolRef sym, CheckerContext &Ctx); 93 PathDiagnosticLocation getLocation() const override { 94 assert(Location.isValid()); 95 return Location; 96 } 97 98 PathDiagnosticLocation getEndOfPath() const { 99 return PathSensitiveBugReport::getLocation(); 100 } 101 }; 102 103 } // end namespace retaincountchecker 104 } // end namespace ento 105 } // end namespace clang 106 107 #endif 108