summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp9
-rw-r--r--clang/test/Analysis/retain-release-safe.c21
2 files changed, 26 insertions, 4 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
index 5571da8fbf4..589054bdaf6 100644
--- a/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
@@ -883,21 +883,22 @@ RetainSummaryManager::getPersistentSummary(const RetainSummary &OldSumm) {
//===----------------------------------------------------------------------===//
static bool isRetain(const FunctionDecl *FD, StringRef FName) {
- return FName.endswith("Retain");
+ return FName.startswith_lower("retain") || FName.endswith_lower("retain");
}
static bool isRelease(const FunctionDecl *FD, StringRef FName) {
- return FName.endswith("Release");
+ return FName.startswith_lower("release") || FName.endswith_lower("release");
}
static bool isAutorelease(const FunctionDecl *FD, StringRef FName) {
- return FName.endswith("Autorelease");
+ return FName.startswith_lower("autorelease") ||
+ FName.endswith_lower("autorelease");
}
static bool isMakeCollectable(const FunctionDecl *FD, StringRef FName) {
// FIXME: Remove FunctionDecl parameter.
// FIXME: Is it really okay if MakeCollectable isn't a suffix?
- return FName.find("MakeCollectable") != StringRef::npos;
+ return FName.find_lower("MakeCollectable") != StringRef::npos;
}
static ArgEffect getStopTrackingHardEquivalent(ArgEffect E) {
diff --git a/clang/test/Analysis/retain-release-safe.c b/clang/test/Analysis/retain-release-safe.c
index de743552428..6cd15009367 100644
--- a/clang/test/Analysis/retain-release-safe.c
+++ b/clang/test/Analysis/retain-release-safe.c
@@ -1,4 +1,5 @@
// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.coreFoundation.CFRetainRelease,osx.cocoa.RetainCount -verify %s
+// RUN: %clang_analyze_cc1 -analyzer-checker=core,osx.coreFoundation.CFRetainRelease,osx.cocoa.RetainCount -analyzer-inline-max-stack-depth=0 -verify %s
#pragma clang arc_cf_code_audited begin
typedef const void * CFTypeRef;
@@ -35,6 +36,19 @@ void SafeCFRelease(CFTypeRef CF_CONSUMED cf) {
CFRelease(cf); // no-warning (when inlined)
}
+// The same thing, just with a different naming style.
+CFTypeRef retainCFType(CFTypeRef cf) CF_RETURNS_RETAINED {
+ if (cf) {
+ return CFRetain(cf);
+ }
+ return cf;
+}
+
+void releaseCFType(CFTypeRef CF_CONSUMED cf) {
+ if (cf)
+ CFRelease(cf); // no-warning (when inlined)
+}
+
void escape(CFTypeRef cf);
void makeSureTestsWork() {
@@ -70,3 +84,10 @@ void falseReleaseNotOwned(CFTypeRef cf) {
SafeCFRelease(cf);
SafeCFRelease(cf); // no-warning after inlining this.
}
+
+void testTheOtherNamingConvention(CFTypeRef cf) {
+ retainCFType(cf);
+ retainCFType(cf);
+ releaseCFType(cf);
+ releaseCFType(cf); // no-warning
+}
OpenPOWER on IntegriCloud