diff options
author | Anna Zaks <ganna@apple.com> | 2013-03-18 20:46:56 +0000 |
---|---|---|
committer | Anna Zaks <ganna@apple.com> | 2013-03-18 20:46:56 +0000 |
commit | 6457ad233504a2af01fd859f363539180e9c73c5 (patch) | |
tree | c7f6c64371edc9cdc2432473cb75d2acfd8b0f8c /clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp | |
parent | e7bac5f5477d1af63bee9b27692ba5e2166d8736 (diff) | |
download | bcm5719-llvm-6457ad233504a2af01fd859f363539180e9c73c5.tar.gz bcm5719-llvm-6457ad233504a2af01fd859f363539180e9c73c5.zip |
[analyzer] Warn when a ‘nil’ object is added to NSArray or NSMutableArray.
llvm-svn: 177318
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp')
-rw-r--r-- | clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp index fdb6bbbe522..a6bcb6930a5 100644 --- a/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/BasicObjCFoundationChecks.cpp @@ -127,8 +127,13 @@ void NilArgChecker::checkPreObjCMessage(const ObjCMethodCall &msg, const ObjCInterfaceDecl *ID = msg.getReceiverInterface(); if (!ID) return; - - if (findKnownClass(ID) == FC_NSString) { + + FoundationClass Class = findKnownClass(ID); + + static const unsigned InvalidArgIndex = UINT_MAX; + unsigned Arg = InvalidArgIndex; + + if (Class == FC_NSString) { Selector S = msg.getSelector(); if (S.isUnarySelector()) @@ -152,10 +157,34 @@ void NilArgChecker::checkPreObjCMessage(const ObjCMethodCall &msg, Name == "compare:options:range:locale:" || Name == "componentsSeparatedByCharactersInSet:" || Name == "initWithFormat:") { - if (isNil(msg.getArgSVal(0))) - WarnNilArg(C, msg, 0); + Arg = 0; + } + } else if (Class == FC_NSArray) { + Selector S = msg.getSelector(); + + if (S.isUnarySelector()) + return; + + if (S.getNameForSlot(0).equals("addObject")) { + Arg = 0; + } else if (S.getNameForSlot(0).equals("insertObject") && + S.getNameForSlot(1).equals("atIndex")) { + Arg = 0; + } else if (S.getNameForSlot(0).equals("replaceObjectAtIndex") && + S.getNameForSlot(1).equals("withObject")) { + Arg = 1; + } else if (S.getNameForSlot(0).equals("setObject") && + S.getNameForSlot(1).equals("atIndexedSubscript")) { + Arg = 0; + } else if (S.getNameForSlot(0).equals("arrayByAddingObject")) { + Arg = 0; } } + + // If argument is '0', report a warning. + if ((Arg != InvalidArgIndex) && isNil(msg.getArgSVal(Arg))) + WarnNilArg(C, msg, Arg); + } //===----------------------------------------------------------------------===// |