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
|
// 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
|
// that doesn't have local storage then just return and have the simulation
|
||||||
// state continue as is.
|
// state continue as is.
|
||||||
|
|
|
@ -2022,6 +2022,20 @@ void rdar13783514(xpc_connection_t connection) {
|
||||||
xpc_connection_set_finalizer_f(connection, releaseAfterXPC);
|
xpc_connection_set_finalizer_f(connection, releaseAfterXPC);
|
||||||
} // no-warning
|
} // 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: <key>diagnostics</key>
|
||||||
// CHECK-NEXT: <array>
|
// CHECK-NEXT: <array>
|
||||||
|
|
Loading…
Reference in New Issue