forked from OSchip/llvm-project
[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:
parent
9fc443aaed
commit
fb05094b52
|
@ -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.
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in New Issue