]> granicus.if.org Git - clang/commitdiff
[analyzer] Reword error messages for nil keys and values of NSMutableDictionary.
authorAnna Zaks <ganna@apple.com>
Fri, 5 Apr 2013 23:50:18 +0000 (23:50 +0000)
committerAnna Zaks <ganna@apple.com>
Fri, 5 Apr 2013 23:50:18 +0000 (23:50 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178935 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp
test/Analysis/NSContainers.m

index 533a324e7507925f988529bed66dbf74e6123cbd..afccb9bebc104afdcc2cb0c63d03b41c2e1b28b6 100644 (file)
@@ -123,18 +123,29 @@ void NilArgChecker::WarnIfNilArg(CheckerContext &C,
       if (Class == FC_NSArray) {
         os << "Array element cannot be nil";
       } else if (Class == FC_NSDictionary) {
-        if (Arg == 0)
-          os << "Dictionary object cannot be nil";
-        else {
+        if (Arg == 0) {
+          os << "Value stored in '";
+          os << GetReceiverInterfaceName(msg) << "' cannot be nil";
+        } else {
           assert(Arg == 1);
-          os << "Dictionary key cannot be nil";
+          os << "'"<< GetReceiverInterfaceName(msg) << "' key cannot be nil";
         }
       } else
         llvm_unreachable("Missing foundation class for the subscript expr");
 
     } else {
-      os << "Argument to '" << GetReceiverInterfaceName(msg) << "' method '"
-      << msg.getSelector().getAsString() << "' cannot be nil";
+      if (Class == FC_NSDictionary) {
+        if (Arg == 0)
+          os << "Value argument ";
+        else {
+          assert(Arg == 1);
+          os << "Key argument ";
+        }
+        os << "to '" << msg.getSelector().getAsString() << "' cannot be nil";
+      } else {
+        os << "Argument to '" << GetReceiverInterfaceName(msg) << "' method '"
+        << msg.getSelector().getAsString() << "' cannot be nil";
+      }
     }
 
     BugReport *R = new BugReport(*BT, os.str(), N);
index d6fded5fd056a2c89bbdaf4534e7b8adf706076c..2be7ae4058bd4233891460694bf25e024b655878 100644 (file)
@@ -115,32 +115,32 @@ void testNilArgNSArray1() {
 
 // NSMutableDictionary and NSDictionary APIs.
 void testNilArgNSMutableDictionary1(NSMutableDictionary *d, NSString* key) {
-  [d setObject:0 forKey:key]; // expected-warning {{Argument to 'NSMutableDictionary' method 'setObject:forKey:' cannot be nil}}
+  [d setObject:0 forKey:key]; // expected-warning {{Value argument to 'setObject:forKey:' cannot be nil}}
 }
 
 void testNilArgNSMutableDictionary2(NSMutableDictionary *d, NSObject *obj) {
-  [d setObject:obj forKey:0]; // expected-warning {{Argument to 'NSMutableDictionary' method 'setObject:forKey:' cannot be nil}}
+  [d setObject:obj forKey:0]; // expected-warning {{Key argument to 'setObject:forKey:' cannot be nil}}
 }
 
 void testNilArgNSMutableDictionary3(NSMutableDictionary *d) {
-  [d removeObjectForKey:0]; // expected-warning {{Argument to 'NSMutableDictionary' method 'removeObjectForKey:' cannot be nil}}
+  [d removeObjectForKey:0]; // expected-warning {{Value argument to 'removeObjectForKey:' cannot be nil}}
 }
 
 void testNilArgNSMutableDictionary5(NSMutableDictionary *d, NSString* key) {
-  d[key] = 0; // expected-warning {{Dictionary object cannot be nil}}
+  d[key] = 0; // expected-warning {{Value stored in 'NSMutableDictionary' cannot be nil}}
 }
 void testNilArgNSMutableDictionary6(NSMutableDictionary *d, NSString *key) {
   if (key)
     ;
-  d[key] = 0; // expected-warning {{Dictionary key cannot be nil}}
-  // expected-warning@-1 {{Dictionary object cannot be nil}}
+  d[key] = 0; // expected-warning {{'NSMutableDictionary' key cannot be nil}}
+  // expected-warning@-1 {{Value stored in 'NSMutableDictionary' cannot be nil}}
 }
 
 NSDictionary *testNilArgNSDictionary1(NSString* key) {
-  return [NSDictionary dictionaryWithObject:0 forKey:key]; // expected-warning {{Argument to 'NSDictionary' method 'dictionaryWithObject:forKey:' cannot be nil}}
+  return [NSDictionary dictionaryWithObject:0 forKey:key]; // expected-warning {{Value argument to 'dictionaryWithObject:forKey:' cannot be nil}}
 }
 NSDictionary *testNilArgNSDictionary2(NSObject *obj) {
-  return [NSDictionary dictionaryWithObject:obj forKey:0]; // expected-warning {{Argument to 'NSDictionary' method 'dictionaryWithObject:forKey:' cannot be nil}}
+  return [NSDictionary dictionaryWithObject:obj forKey:0]; // expected-warning {{Key argument to 'dictionaryWithObject:forKey:' cannot be nil}}
 }
 
 // Test inline defensive checks suppression.