forked from OSchip/llvm-project
[analyzer] RetainCountChecker: don't track through xpc_connection_set_context.
It is unfortunate that we have to mark these exceptions in multiple places. This was already in CallEvent. I suppose it does let us be more precise about saying /which/ arguments have their retain counts invalidated -- the connection's is still valid even though the context object's isn't -- but we're not tracking the retain count of XPC objects anyway. <rdar://problem/13783514> llvm-svn: 180904
This commit is contained in:
parent
10f9d08c70
commit
b147918252
|
|
@ -1116,12 +1116,14 @@ RetainSummaryManager::getFunctionSummary(const FunctionDecl *FD) {
|
|||
// correctly.
|
||||
ScratchArgs = AF.add(ScratchArgs, 12, StopTracking);
|
||||
S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
|
||||
} else if (FName == "dispatch_set_context") {
|
||||
} else if (FName == "dispatch_set_context" ||
|
||||
FName == "xpc_connection_set_context") {
|
||||
// <rdar://problem/11059275> - The analyzer currently doesn't have
|
||||
// a good way to reason about the finalizer function for libdispatch.
|
||||
// If we pass a context object that is memory managed, stop tracking it.
|
||||
// <rdar://problem/13783514> - Same problem, but for XPC.
|
||||
// FIXME: this hack should possibly go away once we can handle
|
||||
// libdispatch finalizers.
|
||||
// libdispatch and XPC finalizers.
|
||||
ScratchArgs = AF.add(ScratchArgs, 1, StopTracking);
|
||||
S = getPersistentSummary(RetEffect::MakeNoRet(), DoNothing, DoNothing);
|
||||
} else if (FName.startswith("NSLog")) {
|
||||
|
|
|
|||
|
|
@ -2003,6 +2003,26 @@ static int Cond;
|
|||
[x release];
|
||||
}
|
||||
@end
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// <rdar://problem/13783514> xpc_connection_set_finalizer_f
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
typedef xpc_object_t xpc_connection_t;
|
||||
typedef void (*xpc_finalizer_t)(void *value);
|
||||
void xpc_connection_set_context(xpc_connection_t connection, void *ctx);
|
||||
void xpc_connection_set_finalizer_f(xpc_connection_t connection,
|
||||
xpc_finalizer_t finalizer);
|
||||
void releaseAfterXPC(void *context) {
|
||||
[(NSArray *)context release];
|
||||
}
|
||||
|
||||
void rdar13783514(xpc_connection_t connection) {
|
||||
xpc_connection_set_context(connection, [[NSMutableArray alloc] init]);
|
||||
xpc_connection_set_finalizer_f(connection, releaseAfterXPC);
|
||||
} // no-warning
|
||||
|
||||
|
||||
// CHECK: <key>diagnostics</key>
|
||||
// CHECK-NEXT: <array>
|
||||
// CHECK-NEXT: <dict>
|
||||
|
|
|
|||
Loading…
Reference in New Issue