I have this code:
- (CGImageRef)createImageWithContext:(CGContextRef)context
{
return CGBitmapContextCreateImage(context);
}
- (void)fooWithContext:(CGContextRef)context
{
CGImageRef imgRef = [self createImageWithContext:context];
CGImageRelease(imgRef);
}
This is an Objective-C project building in Xcode with ARC enabled. Build and Analyze reports two errors: One on the CGBitmapContextCreateImage line identifying a potential leak, and one on the CGImageRelease noting an "Incorrect decrement of the reference count of an object that is not owned at this point by the caller".
If I combine these two functions into one:
- (void)fooWithContext:(CGContextRef)context
{
CGImageRef imgRef = CGBitmapContextCreateImage(context);
CGImageRelease(imgRef);
}
I get no warnings.
Static code analysis bug? Or am I missing something here?
By the standard Cocoa naming conventions, a method that starts with the word create
should return a non-owned reference. You're returning a retained object, but you're expected to return a non-retained object. Thus, the when the analyzer looks at -createImageWithContext:
, it sees that it's supposed to return a non-retained object, but is actually returning a retained object. Hence the first warning.
In -fooWithContext:
, it looks at your code and says "Hey, according to my naming conventions, createImageWithContext:
should return a non-owning reference. But then they're releasing something they don't own! That's BAD!" Hence the second warning.
You could fix this by changing the name of -createImageWithContext:
to something that starts with new
, such as -newImageWithContext:
. Or you could annotate the method with the cf_returns_retained
macro to indicate to the static analyzer that the method is returning an owning reference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With