From: Devin Coughlin Date: Thu, 3 Mar 2016 21:38:39 +0000 (+0000) Subject: [analyzer] ObjCDeallocChecker: Only check for nil-out when type is retainable. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5d64047903eb9f048cd8eaf3586ade3a7a51b61d;p=clang [analyzer] ObjCDeallocChecker: Only check for nil-out when type is retainable. This fixes a crash when setting a property of struct type in -dealloc. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@262659 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp b/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp index c09924cfc2..f9fd9fcf95 100644 --- a/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp +++ b/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp @@ -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) = diff --git a/test/Analysis/DeallocMissingRelease.m b/test/Analysis/DeallocMissingRelease.m index 383bacb539..75afd0e5f1 100644 --- a/test/Analysis/DeallocMissingRelease.m +++ b/test/Analysis/DeallocMissingRelease.m @@ -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];