On Jan 13, 2010, at 5:54 PM, Graham Cox wrote:
> @implementation NSData (SHA1Hash)
> 
> - (NSData*)   sha1Hash
> {
>       // calculates the 160 bit SHA-1 digest of the given data
>       
>       unsigned char* digest = (unsigned char*) malloc(20);
>       SHA1([self bytes], [self length], digest);
>       
>       return [[self class] dataWithBytesNoCopy:digest length:20];
> }
> 
> @end
> 
> The static analyzer reports this:
> 
>       Potential leak of an object allocated on line 622
> 
>               Method returns an Objective-C object with a +1 retain count 
> (owning reference)
>               Object returned to caller as an owning reference (single retain 
> count transferred to caller)
>               Object allocated on line 622 is returned from a method whose 
> name ('sha1Hash') does not contain 'copy' or otherwise starts with 'new' or 
> 'alloc'.  This violates                the naming convention rules given in 
> the Memory Management Guide for Cocoa (object leaked)
> 
> But I think this is wrong - [NSData dataWithBytesNoCopy] returns an object I 
> don't own, and it in turn takes ownership of <digest>. So where's the leak? 
> Is clang simply mistaking the fact that +dataWithBytesNoCopy CONTAINS 'copy' 
> and not STARTS WITH copy?

Yes, the static analyzer is wrong here. 

The Official Rule is '... contains "copy" ...'. This is a case where a 
mechanical interpretation of the Official Rule isn't quite right. 

The static analyzer does have a special case for +[NSData 
dataWithBytesNoCopy:length:]. 
http://lists.cs.uiuc.edu/pipermail/cfe-commits/Week-of-Mon-20090511/017258.html

But your code sends the message to [self class] instead of NSData, so perhaps 
the special case is not recognized. Alternatively, perhaps your Xcode isn't the 
newest available.

Try this to suppress the complaint:
    return [(NSData *)[self class] dataWithBytesNoCopy:digest length:20];


-- 
Greg Parker     gpar...@apple.com     Runtime Wrangler


_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to