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