]> granicus.if.org Git - clang/commitdiff
Tweak the interface for analyzing the CF conventions for a name
authorJohn McCall <rjmccall@apple.com>
Sat, 1 Oct 2011 00:48:56 +0000 (00:48 +0000)
committerJohn McCall <rjmccall@apple.com>
Sat, 1 Oct 2011 00:48:56 +0000 (00:48 +0000)
to take a FunctionDecl* instead of an llvm::StringRef.  Eventually
we might push more logic in there, like using slightly different
conventions for C++ methods.

Also, fix a bug where 'copy' and 'create' were being caught in
non-camel-cased strings.  We want copyFoo and CopyFoo and XCopy
but not Xcopy or xcopy.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@140911 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Analysis/DomainSpecific/CocoaConventions.h
lib/Analysis/CocoaConventions.cpp
lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp
test/Analysis/retain-release.mm

index 25465f6b5d290293ee767995a1f077400ab4ec4e..fa8afccfcd895576bc789a923eef98e103582626 100644 (file)
 #ifndef LLVM_CLANG_ANALYSIS_DS_COCOA
 #define LLVM_CLANG_ANALYSIS_DS_COCOA
 
+#include "clang/Basic/IdentifierTable.h"
 #include "llvm/ADT/StringRef.h"
-#include "clang/AST/Type.h"
 
 namespace clang {
-  
+class FunctionDecl;
 class ObjCMethodDecl;
+class QualType;
   
 namespace ento {
 namespace cocoa {
@@ -43,7 +44,7 @@ namespace cocoa {
 namespace coreFoundation {
   bool isCFObjectRef(QualType T);
   
-  bool followsCreateRule(StringRef functionName);
+  bool followsCreateRule(const FunctionDecl *FD);
 }
 
 }} // end: "clang:ento"
index 3926ce55aa256e38f93717f9d7bf705c5592e0da..8acd1892f9c74d416e33e80727b7f5b6b05c01c1 100644 (file)
@@ -125,7 +125,13 @@ bool cocoa::isCocoaObjectRef(QualType Ty) {
   return false;
 }
 
-bool coreFoundation::followsCreateRule(StringRef functionName) {
+bool coreFoundation::followsCreateRule(const FunctionDecl *fn) {
+  // For now, *just* base this on the function name, not on anything else.
+
+  const IdentifierInfo *ident = fn->getIdentifier();
+  if (!ident) return false;
+  StringRef functionName = ident->getName();
+  
   StringRef::iterator it = functionName.begin();
   StringRef::iterator start = it;
   StringRef::iterator endI = functionName.end();
@@ -136,6 +142,10 @@ bool coreFoundation::followsCreateRule(StringRef functionName) {
       // Search for the first character.  It can either be 'C' or 'c'.
       char ch = *it;
       if (ch == 'C' || ch == 'c') {
+        // Make sure this isn't something like 'recreate' or 'Scopy'.
+        if (ch == 'c' && it != start && isalpha(*(it - 1)))
+          continue;
+
         ++it;
         break;
       }
index 695cc037e86033914ebedc5d36aecc3c920a113b..0a23d5b6bb81676ba852c67facffb18a72fa03fc 100644 (file)
@@ -623,8 +623,7 @@ public:
 
   RetainSummary* getCFSummaryCreateRule(const FunctionDecl *FD);
   RetainSummary* getCFSummaryGetRule(const FunctionDecl *FD);
-  RetainSummary* getCFCreateGetRuleSummary(const FunctionDecl *FD, 
-                                           StringRef FName);
+  RetainSummary* getCFCreateGetRuleSummary(const FunctionDecl *FD);
 
   RetainSummary* getPersistentSummary(ArgEffects AE, RetEffect RetEff,
                                       ArgEffect ReceiverEff = DoNothing,
@@ -1000,7 +999,7 @@ RetainSummary* RetainSummaryManager::getSummary(const FunctionDecl *FD) {
         else if (isMakeCollectable(FD, FName))
           S = getUnarySummary(FT, cfmakecollectable);
         else
-          S = getCFCreateGetRuleSummary(FD, FName);
+          S = getCFCreateGetRuleSummary(FD);
 
         break;
       }
@@ -1010,7 +1009,7 @@ RetainSummary* RetainSummaryManager::getSummary(const FunctionDecl *FD) {
         if (isRetain(FD, FName))
           S = getUnarySummary(FT, cfretain);
         else
-          S = getCFCreateGetRuleSummary(FD, FName);
+          S = getCFCreateGetRuleSummary(FD);
 
         break;
       }
@@ -1019,7 +1018,7 @@ RetainSummary* RetainSummaryManager::getSummary(const FunctionDecl *FD) {
       if (cocoa::isRefType(RetTy, "DADisk") ||
           cocoa::isRefType(RetTy, "DADissenter") ||
           cocoa::isRefType(RetTy, "DASessionRef")) {
-        S = getCFCreateGetRuleSummary(FD, FName);
+        S = getCFCreateGetRuleSummary(FD);
         break;
       }
 
@@ -1072,9 +1071,8 @@ RetainSummary* RetainSummaryManager::getSummary(const FunctionDecl *FD) {
 }
 
 RetainSummary*
-RetainSummaryManager::getCFCreateGetRuleSummary(const FunctionDecl *FD,
-                                                StringRef FName) {
-  if (coreFoundation::followsCreateRule(FName))
+RetainSummaryManager::getCFCreateGetRuleSummary(const FunctionDecl *FD) {
+  if (coreFoundation::followsCreateRule(FD))
     return getCFSummaryCreateRule(FD);
 
   return getCFSummaryGetRule(FD);
index 7c6f9e3c4aaad16f52988799ad2526e772134af1..bae8dc3392547da13e83bb95523b5ffc2f229b9e 100644 (file)
@@ -304,4 +304,14 @@ void test_smartpointer_3() {
   foo.noAdopt(x);
 }
 
+extern CFStringRef ElectronMicroscopyEngage(void);
+void test_microscopy() {
+  NSString *token = (NSString*) ElectronMicroscopyEngage();
+  [token release]; // expected-warning {{object that is not owned}}
+}
 
+extern CFStringRef Scopy(void);
+void test_Scopy() {
+  NSString *token = (NSString*) Scopy();
+  [token release]; // expected-warning {{object that is not owned}}
+}