Make the Objective-C checker look for subclasses of NSString instead of just NSString and NSMutableString.

llvm-svn: 127268
This commit is contained in:
Anders Carlsson 2011-03-08 20:05:26 +00:00
parent eee5413f3b
commit 3c50aea73f
2 changed files with 22 additions and 14 deletions

View File

@ -41,20 +41,21 @@ public:
// Utility functions.
//===----------------------------------------------------------------------===//
static const ObjCInterfaceType* GetReceiverType(const ObjCMessage &msg) {
if (const ObjCInterfaceDecl *ID = msg.getReceiverInterface())
return ID->getTypeForDecl()->getAs<ObjCInterfaceType>();
return NULL;
}
static const char* GetReceiverNameType(const ObjCMessage &msg) {
if (const ObjCInterfaceType *ReceiverType = GetReceiverType(msg))
return ReceiverType->getDecl()->getIdentifier()->getNameStart();
return NULL;
if (const ObjCInterfaceDecl *ID = msg.getReceiverInterface())
return ID->getIdentifier()->getNameStart();
return 0;
}
static bool isNSString(llvm::StringRef ClassName) {
return ClassName == "NSString" || ClassName == "NSMutableString";
static bool isReceiverClassOrSuperclass(const ObjCInterfaceDecl *ID,
llvm::StringRef ClassName) {
if (ID->getIdentifier()->getName() == ClassName)
return true;
if (const ObjCInterfaceDecl *Super = ID->getSuperClass())
return isReceiverClassOrSuperclass(Super, ClassName);
return false;
}
static inline bool isNil(SVal X) {
@ -98,11 +99,11 @@ void NilArgChecker::WarnNilArg(CheckerContext &C,
void NilArgChecker::checkPreObjCMessage(ObjCMessage msg,
CheckerContext &C) const {
const ObjCInterfaceType *ReceiverType = GetReceiverType(msg);
if (!ReceiverType)
const ObjCInterfaceDecl *ID = msg.getReceiverInterface();
if (!ID)
return;
if (isNSString(ReceiverType->getDecl()->getIdentifier()->getName())) {
if (isReceiverClassOrSuperclass(ID, "NSString")) {
Selector S = msg.getSelector();
if (S.isUnarySelector())

View File

@ -190,6 +190,13 @@ void f13(void) {
CFRelease(ref); // expected-warning{{Reference-counted object is used after it is released}}
}
@interface MyString : NSString
@end
void f14(MyString *s) {
[s compare:0]; // expected-warning {{Argument to 'MyString' method 'compare:' cannot be nil.}}
}
// Test regular use of -autorelease
@interface TestAutorelease
-(NSString*) getString;