forked from OSchip/llvm-project
[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:
parent
0adc042392
commit
ba34272321
|
@ -110,7 +110,9 @@ void DynamicTypePropagation::checkPostCall(const CallEvent &Call,
|
|||
return;
|
||||
|
||||
ProgramStateRef State = C.getState();
|
||||
const ObjCMethodDecl *D = Msg->getDecl();
|
||||
|
||||
if (D && D->hasRelatedResultType()) {
|
||||
switch (Msg->getMethodFamily()) {
|
||||
default:
|
||||
break;
|
||||
|
@ -141,7 +143,7 @@ void DynamicTypePropagation::checkPostCall(const CallEvent &Call,
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -82,3 +82,20 @@ int testDynamicClass(BOOL coin) {
|
|||
return [x getZero];
|
||||
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
|
Loading…
Reference in New Issue