diff options
| author | Artem Dergachev <artem.dergachev@gmail.com> | 2019-03-15 00:26:17 +0000 |
|---|---|---|
| committer | Artem Dergachev <artem.dergachev@gmail.com> | 2019-03-15 00:26:17 +0000 |
| commit | f2192b204ff49561cc73fe06a76216f3cab39d84 (patch) | |
| tree | c601a48b83201e9b72d5bee3c60e0214dcff85af /clang | |
| parent | 06451368d2f0efb723ac4dc392c705b787f56253 (diff) | |
| download | bcm5719-llvm-f2192b204ff49561cc73fe06a76216f3cab39d84.tar.gz bcm5719-llvm-f2192b204ff49561cc73fe06a76216f3cab39d84.zip | |
[analyzer] RetainCount: A function isn't a CFRetain if it takes no arguments.
Don't crash when a function has a name that starts with "CF" and ends with
"Retain" but takes 0 arguments. In particular, don't try to treat it as if
it returns its first argument.
These problems are inevitable because the checker is naming-convention-based,
but at least we shouldn't crash.
Differential Revision: https://reviews.llvm.org/D59123
llvm-svn: 356223
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/lib/Analysis/RetainSummaryManager.cpp | 13 | ||||
| -rw-r--r-- | clang/test/Analysis/retain-release.mm | 12 |
2 files changed, 19 insertions, 6 deletions
diff --git a/clang/lib/Analysis/RetainSummaryManager.cpp b/clang/lib/Analysis/RetainSummaryManager.cpp index 2eee01ca6a6..ae8ccb13ca5 100644 --- a/clang/lib/Analysis/RetainSummaryManager.cpp +++ b/clang/lib/Analysis/RetainSummaryManager.cpp @@ -722,12 +722,13 @@ RetainSummaryManager::canEval(const CallExpr *CE, const FunctionDecl *FD, // These are not retain. They just return something and retain it. return None; } - if (cocoa::isRefType(ResultTy, "CF", FName) || - cocoa::isRefType(ResultTy, "CG", FName) || - cocoa::isRefType(ResultTy, "CV", FName)) - if (isRetain(FD, FName) || isAutorelease(FD, FName) || - isMakeCollectable(FName)) - return BehaviorSummary::Identity; + if (CE->getNumArgs() == 1 && + (cocoa::isRefType(ResultTy, "CF", FName) || + cocoa::isRefType(ResultTy, "CG", FName) || + cocoa::isRefType(ResultTy, "CV", FName)) && + (isRetain(FD, FName) || isAutorelease(FD, FName) || + isMakeCollectable(FName))) + return BehaviorSummary::Identity; // safeMetaCast is called by OSDynamicCast. // We assume that OSDynamicCast is either an identity (cast is OK, diff --git a/clang/test/Analysis/retain-release.mm b/clang/test/Analysis/retain-release.mm index 97ea5607d2d..ba864f817c5 100644 --- a/clang/test/Analysis/retain-release.mm +++ b/clang/test/Analysis/retain-release.mm @@ -503,3 +503,15 @@ void test_cxx_method_escaping(S *s) { } } + +namespace yet_another_unexpected_signature_crash { + +CFTypeRef CFSomethingSomethingRetain(); +CFTypeRef CFSomethingSomethingAutorelease(); + +void foo() { + CFSomethingSomethingRetain(); // no-crash + CFSomethingSomethingAutorelease(); // no-crash +} + +} |

