From: Anna Zaks Date: Fri, 5 Apr 2013 23:50:18 +0000 (+0000) Subject: [analyzer] Reword error messages for nil keys and values of NSMutableDictionary. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=24cac5a4847b9e4673afb9fd02701f273097f57a;p=clang [analyzer] Reword error messages for nil keys and values of NSMutableDictionary. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@178935 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp b/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp index 533a324e75..afccb9bebc 100644 --- a/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp +++ b/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp @@ -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); diff --git a/test/Analysis/NSContainers.m b/test/Analysis/NSContainers.m index d6fded5fd0..2be7ae4058 100644 --- a/test/Analysis/NSContainers.m +++ b/test/Analysis/NSContainers.m @@ -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.