[cfe-dev] Missing dealloc analysis

David Chisnall csdavec at swansea.ac.uk
Thu Jul 3 10:30:34 PDT 2008


On 3 Jul 2008, at 18:18, Jean-Daniel Dupas wrote:

>
> Le 3 juil. 08 à 18:28, Ted Kremenek a écrit :
>
>> Hi Nikita,
>>
>> On Jul 2, 2008, at 10:35 PM, Nikita Zhuk wrote:
>>
>>> I noticed the addition of missing dealloc analysis in r53075. It's a
>>> good idea to check that dealloc is implemented and that it always
>>> calls [super dealloc], but there're couple of points I would like to
>>> mention:
>>>
>>> 1. It should be disabled in GC environment, because dealloc methods
>>> are not called under GC
>>
>> Done:
>>
>>  http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20080630/006371.html
>>
>>> 2. In non-GC environment, the primary function of dealloc method  
>>> is to
>>> update retain counts of variables the object being dealloced is
>>> pointing to. So that usually means that dealloc must be implemented
>>> when an object has some ivars. Dealloc is not always required, and
>>> there're lot of classes which don't need it (e.g. singleton  
>>> classes).
>>> Currently missing dealloc analysis requires every class to implement
>>> dealloc and it's causing a lot of false positives.
>>>
>>> I'm not completely sure if absence of ivars should be the only  
>>> factor
>>> which disables missing dealloc analysis, but at least in my case it
>>> would suppress a lot of false positives.
>>
>> Done:
>>
>>  http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20080630/006373.html
>>
>> Both commits are now rolled into checker-55 on the Clang website.
>>
>> These are both great suggestions.  I remembered the GC/non-GC issue
>> this morning before I read your email, and I can easily see how not
>> checking to see if a class contains any ivars would lead to many  
>> false
>> positives.  I also believe that checking for ivars should also handle
>> the Singleton design pattern (please correct me if I am wrong).
>
> Why do you think singleton class need a special case ?
>
> in obj-c a singleton class is usually implemented using a class  
> method that return a shared instance:
>
> + (id)sharedInstance {
> 	static Foo *sharedInstance = nil;
> 	if (!sharedInstance) {
> 		sharedInstance = [[Foo alloc] init];
> 	}
> 	return sharedInstance;
> }
>
> optionaly you can also override +alloc, -init, -retain, -release to  
> prevent creation of other instance, and destruction of the shared  
> instance, but this is not recommanded (except if you have a good  
> reason to do so).
>
> It's a good practice to release ivars in a singleton dealloc, even  
> if dealloc may never be call (like that, if needed, you can create  
> other instance of this class).
>
> So I don't think it need a special case, but I maybe wrong too.

This is especially true when you consider subclassing.  A singleton  
can not guarantee that its subclasses will also be singletons, and so  
should release all of its ivars when it is -dealloc'd, or risk causing  
leaks if it is subclassed.

If a singleton needs to have shared resources that are also shared  
with subclasses then it should store them in file statics, no ivars.

David



More information about the cfe-dev mailing list