[analyzer] ObjCDeallocChecker: Only check for nil-out when type is retainable.

This fixes a crash when setting a property of struct type in -dealloc.

llvm-svn: 262659
This commit is contained in:
Devin Coughlin 2016-03-03 21:38:39 +00:00
parent c1a7c97c1b
commit 578a20a82e
2 changed files with 24 additions and 1 deletions

View File

@ -860,9 +860,13 @@ ObjCDeallocChecker::getValueReleasedByNillingOut(const ObjCMethodCall &M,
if (!ReceiverVal.isValid())
return nullptr;
// Is the first argument nil?
if (M.getNumArgs() == 0)
return nullptr;
if (!M.getArgExpr(0)->getType()->isObjCRetainableType())
return nullptr;
// Is the first argument nil?
SVal Arg = M.getArgSVal(0);
ProgramStateRef notNilState, nilState;
std::tie(notNilState, nilState) =

View File

@ -664,6 +664,25 @@ void ReleaseMe(id arg);
@end
#endif
struct SomeStruct {
int f;
};
@interface ZeroOutStructWithSetter : NSObject
@property(assign) struct SomeStruct s;
@end
@implementation ZeroOutStructWithSetter
- (void)dealloc {
struct SomeStruct zeroedS;
zeroedS.f = 0;
self.s = zeroedS;
#if NON_ARC
[super dealloc];
#endif
}
@end
#if NON_ARC
@interface ReleaseIvarInArray : NSObject {
NSObject *_array[3];