[analyzer] Stop tracking the objects with attribute cleanup in the RetainCountChecker.

This suppresses false positive leaks. We stop tracking a value if it is assigned to a variable declared with a cleanup attribute.

llvm-svn: 190835
This commit is contained in:
Anna Zaks 2013-09-17 00:53:28 +00:00
parent 9fc443aaed
commit fb05094b52
2 changed files with 24 additions and 0 deletions

View File

@ -3356,6 +3356,16 @@ void RetainCountChecker::checkBind(SVal loc, SVal val, const Stmt *S,
}
}
// If we are storing the value into an auto function scope variable annotated
// with (__attribute__((cleanup))), stop tracking the value to avoid leak
// false positives.
if (const VarRegion *LVR = dyn_cast_or_null<VarRegion>(loc.getAsRegion())) {
const VarDecl *VD = LVR->getDecl();
if (VD->getAttr<CleanupAttr>()) {
escapes = true;
}
}
// If our store can represent the binding and we aren't storing to something
// that doesn't have local storage then just return and have the simulation
// state continue as is.

View File

@ -2022,6 +2022,20 @@ void rdar13783514(xpc_connection_t connection) {
xpc_connection_set_finalizer_f(connection, releaseAfterXPC);
} // no-warning
// Do not report leaks when object is cleaned up with __attribute__((cleanup ..)).
inline static void cleanupFunction(void *tp) {
CFTypeRef x = *(CFTypeRef *)tp;
if (x) {
CFRelease(x);
}
}
#define ADDCLEANUP __attribute__((cleanup(cleanupFunction)))
void foo() {
ADDCLEANUP CFStringRef myString;
myString = CFStringCreateWithCString(0, "hello world", kCFStringEncodingUTF8);
ADDCLEANUP CFStringRef myString2 =
CFStringCreateWithCString(0, "hello world", kCFStringEncodingUTF8);
}
// CHECK: <key>diagnostics</key>
// CHECK-NEXT: <array>