discuss-gnustep
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Crash in countByEnumeratingWithState method of GNUstep's implementat


From: Quentin Mathé
Subject: Re: Crash in countByEnumeratingWithState method of GNUstep's implementation of NSArray
Date: Wed, 8 Jan 2014 13:21:09 +0100

Hi Matthias,

Le 8 janv. 2014 à 10:45, Mathias Bauer a écrit :

> Hi,
> 
> it seems that the implementation of countByEnumeratingWithState in NSArray is 
> broken.
> 
> The following code in NSArray.m
> 
>> {
>>   NSUInteger size = [self count];
>>   NSInteger count;
>> 
>>   /* This is cached in the caller at the start and compared at each
>>    * iteration.   If it changes during the iteration then
>>    * objc_enumerationMutation() will be called, throwing an exception.
>>    */
>>   state->mutationsPtr = (unsigned long *)size;
> 
> of course crashes as soon as any fast enumeration is executed for any 
> collection deriving from NSArray. The cast in the last line can't work.
> 
> Now I'm wondering how this problem could remain undiscovered or at least 
> unfixed for such a long time. I doubt that everybody who implemented a class 
> that derives from NSArray also re-implemented this method.

I just stumbled on it today while testing some custom NSArray subclass. I think 
most people don't write NSArray subclass, and GNUstep concrete subclasses are 
all overriding the fast enumeration method, so the default fast enumeration 
implementation in NSArray was just never executed.

> A simple fix would be to add an iVar that gets the result of [self count] 
> each time this method is called and assigning its address to 
> state->mutationsPtr.

The following should be enough to fix it: state->mutationsPtr = (unsigned long 
*)&size;

> Any chance for getting this fixed in the trunk version?

I'll commit this fix today.

Cheers,
Quentin.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]