From: Ted Kremenek Date: Wed, 5 Nov 2008 16:54:44 +0000 (+0000) Subject: initXXX methods can return owned objects X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4c79e55951517e9b3c06d0b7ac4bd82320f43f4b;p=clang initXXX methods can return owned objects git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@58758 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index 80c6bf9532..1a38d957eb 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -57,7 +57,12 @@ static bool followsFundamentalRule(const char* s) { while (*s == '_') ++s; return CStrInCStrNoCase(s, "create") || CStrInCStrNoCase(s, "copy") || CStrInCStrNoCase(s, "new") == s || CStrInCStrNoCase(s, "alloc") == s; -} +} + +static bool followsReturnRule(const char* s) { + while (*s == '_') ++s; + return followsFundamentalRule(s) || CStrInCStrNoCase(s, "init") == s; +} //===----------------------------------------------------------------------===// // Selector creation functions. @@ -1878,7 +1883,7 @@ CFRefCount::HandleSymbolDeath(GRStateManager& VMgr, if (V.isReturnedOwned() && V.getCount() == 0) if (const ObjCMethodDecl* MD = dyn_cast(CD)) { std::string s = MD->getSelector().getName(); - if (!followsFundamentalRule(s.c_str())) { + if (!followsReturnRule(s.c_str())) { hasLeak = true; state = state.set(sid, V ^ RefVal::ErrorLeakReturned); return std::make_pair(state, true);