diff options
| author | George Karpenkov <ekarpenkov@apple.com> | 2018-12-06 22:06:44 +0000 |
|---|---|---|
| committer | George Karpenkov <ekarpenkov@apple.com> | 2018-12-06 22:06:44 +0000 |
| commit | a71ec6c00a181bc68ace4edb130bdcf6d9feb66e (patch) | |
| tree | 4063f406511c91a74861f7b905101fb99db2a295 | |
| parent | b7156fb504609c64412644d053344a3ce89bcc59 (diff) | |
| download | bcm5719-llvm-a71ec6c00a181bc68ace4edb130bdcf6d9feb66e.tar.gz bcm5719-llvm-a71ec6c00a181bc68ace4edb130bdcf6d9feb66e.zip | |
[analyzer] Fix an infinite recursion bug while checking parent methods in RetainCountChecker
Differential Revision: https://reviews.llvm.org/D55351
llvm-svn: 348531
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp | 2 | ||||
| -rw-r--r-- | clang/test/Analysis/osobject-retain-release.cpp | 12 |
2 files changed, 13 insertions, 1 deletions
diff --git a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp index 2bdfd2d0d06..0e82d9ab400 100644 --- a/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp +++ b/clang/lib/StaticAnalyzer/Core/RetainSummaryManager.cpp @@ -730,7 +730,7 @@ bool applyFunctionParamAnnotationEffect(const ParmVarDecl *pd, if (const auto *MD = dyn_cast<CXXMethodDecl>(FD)) { for (const auto *OD : MD->overridden_methods()) { const ParmVarDecl *OP = OD->parameters()[parm_idx]; - if (applyFunctionParamAnnotationEffect(OP, parm_idx, MD, AF, Template)) + if (applyFunctionParamAnnotationEffect(OP, parm_idx, OD, AF, Template)) return true; } } diff --git a/clang/test/Analysis/osobject-retain-release.cpp b/clang/test/Analysis/osobject-retain-release.cpp index 398857f4545..a596d0d1b63 100644 --- a/clang/test/Analysis/osobject-retain-release.cpp +++ b/clang/test/Analysis/osobject-retain-release.cpp @@ -45,6 +45,8 @@ struct OSArray : public OSObject { OSObject *identity() override; + virtual OSObject *generateObject(OSObject *input); + virtual void consumeReference(OS_CONSUME OSArray *other); static OSArray *generateArrayHasCode() { @@ -68,6 +70,8 @@ struct MyArray : public OSArray { void consumeReference(OSArray *other) override; OSObject *identity() override; + + OSObject *generateObject(OSObject *input) override; }; struct OtherStruct { @@ -79,6 +83,14 @@ struct OSMetaClassBase { static OSObject *safeMetaCast(const OSObject *inst, const OSMetaClass *meta); }; +void test_no_infinite_check_recursion(MyArray *arr) { + OSObject *input = new OSObject; + OSObject *o = arr->generateObject(input); + o->release(); + input->release(); +} + + void check_param_attribute_propagation(MyArray *parent) { OSArray *arr = new OSArray; parent->consumeReference(arr); |

