From: Ted Kremenek Date: Wed, 28 Jan 2009 06:25:48 +0000 (+0000) Subject: retain/release checker: Improve diagnostics to indicate that CF objects are not autom... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=23b8eaa83659dcae7f4be1618988094c5f2bd176;p=clang retain/release checker: Improve diagnostics to indicate that CF objects are not automatically garbage collected. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@63187 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Analysis/CFRefCount.cpp b/lib/Analysis/CFRefCount.cpp index bd5e3b4d53..625eda4fb1 100644 --- a/lib/Analysis/CFRefCount.cpp +++ b/lib/Analysis/CFRefCount.cpp @@ -2356,8 +2356,15 @@ PathDiagnosticPiece* CFRefReport::VisitNode(const ExplodedNode* N, os << " returns an Objective-C object with a "; } - if (CurrV.isOwned()) - os << "+1 retain count (owning reference)."; + if (CurrV.isOwned()) { + os << "+1 retain count (owning reference)."; + + if (static_cast(getBugType()).getTF().isGCEnabled()) { + assert(CurrV.getObjKind() == RetEffect::CF); + os << " " + "Core Foundation objects are not automatically garbage collected."; + } + } else { assert (CurrV.isNotOwned()); os << "+0 retain count (non-owning reference)."; diff --git a/test/Analysis/CFDateGC.m b/test/Analysis/CFDateGC.m index 5ed8ae9609..c405fe24e5 100644 --- a/test/Analysis/CFDateGC.m +++ b/test/Analysis/CFDateGC.m @@ -26,6 +26,7 @@ typedef signed char BOOL; static __inline__ __attribute__((always_inline)) id NSMakeCollectable(CFTypeRef cf) {} @protocol NSObject - (BOOL)isEqual:(id)object; - (oneway void)release; +- (id)retain; @end @class NSArray; @@ -46,7 +47,7 @@ CFAbsoluteTime f1_use_after_release() { // The following two test cases verifies that CFMakeCollectable is a no-op // in non-GC mode and a "release" in GC mode. -CFAbsoluteTime f2_leak() { +CFAbsoluteTime f2_use_after_release() { CFAbsoluteTime t = CFAbsoluteTimeGetCurrent(); CFDateRef date = CFDateCreate(0, t); CFRetain(date); @@ -68,6 +69,11 @@ CFAbsoluteTime f2_noleak() { return t; } +void f3_leak_with_gc() { + CFDateRef date = CFDateCreate(0, CFAbsoluteTimeGetCurrent()); + [[(id) date retain] release]; // expected-warning{{leak}} +} + // The following test case verifies that we "stop tracking" a retained object // when it is passed as an argument to an implicitly defined function. CFAbsoluteTime f4() {