[analyzer] Restrict ObjC type inference to methods that have related result type.

This addresses a case when we inline a wrong method due to incorrect
dynamic type inference. Specifically, when user code contains a method from init
family, which creates an instance of another class.

Use hasRelatedResultType() to find out if our inference rules should be triggered.

llvm-svn: 176054
This commit is contained in:
Anna Zaks 2013-02-25 22:10:34 +00:00
parent 0adc042392
commit ba34272321
2 changed files with 48 additions and 29 deletions

View File

@ -110,7 +110,9 @@ void DynamicTypePropagation::checkPostCall(const CallEvent &Call,
return; return;
ProgramStateRef State = C.getState(); ProgramStateRef State = C.getState();
const ObjCMethodDecl *D = Msg->getDecl();
if (D && D->hasRelatedResultType()) {
switch (Msg->getMethodFamily()) { switch (Msg->getMethodFamily()) {
default: default:
break; break;
@ -141,7 +143,7 @@ void DynamicTypePropagation::checkPostCall(const CallEvent &Call,
break; break;
} }
} }
}
return; return;
} }

View File

@ -82,3 +82,20 @@ int testDynamicClass(BOOL coin) {
return [x getZero]; return [x getZero];
return 1; return 1;
} }
@interface UserClass : NSObject
- (PublicSubClass2 *) _newPublicSubClass2;
- (int) getZero;
- (void) callNew;
@end
@implementation UserClass
- (PublicSubClass2 *) _newPublicSubClass2 {
return [[PublicSubClass2 alloc] init];
}
- (int) getZero { return 5; }
- (void) callNew {
PublicSubClass2 *x = [self _newPublicSubClass2];
clang_analyzer_eval([x getZero] == 0); //expected-warning{{TRUE}}
}
@end