Add special warning about returning a retained object where a GC'ed object is expected.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@71397 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2009-05-10 16:52:15 +00:00
Родитель e8720ce787
Коммит 82f2be584e
2 изменённых файлов: 14 добавлений и 8 удалений

Просмотреть файл

@ -2517,9 +2517,10 @@ CFRefLeakReport::getEndPath(BugReporterContext& BRC,
else if (RV->getKind() == RefVal::ErrorGCLeakReturned) {
ObjCMethodDecl& MD = cast<ObjCMethodDecl>(BRC.getCodeDecl());
os << " and returned from method '" << MD.getSelector().getAsString()
<< "' is potentially leaked when using garbage collection. Callers"
" of this method do not expect a +1 retain count since the return"
" type is an Objective-C object reference";
<< "' is potentially leaked when using garbage collection. Callers "
"of this method do not expect a returned object with a +1 retain "
"count since they expect the object to be managed by the garbage "
"collector";
}
else
os << " is no longer referenced after this point and has a retain count of"
@ -3073,11 +3074,12 @@ void CFRefCount::EvalReturn(ExplodedNodeSet<GRState>& Dst,
if (isGCEnabled() && RE.getObjKind() == RetEffect::ObjC) {
// Things are more complicated with garbage collection. If the
// returned object is suppose to be an Objective-C object, we have
// a leak (as the caller expects a GC'ed object).
// a leak (as the caller expects a GC'ed object) because no
// method should return ownership unless it returns a CF object.
X = X ^ RefVal::ErrorGCLeakReturned;
// Keep this false until this is properly tested.
hasError = false;
hasError = true;
}
else if (!RE.isOwned()) {
// Either we are using GC and the returned object is a CF type

Просмотреть файл

@ -128,13 +128,17 @@ void f3() {
// is expected.
@interface TestReturnNotOwnedWhenExpectedOwned
- (NSString*)newString;
- (CFMutableArrayRef)newArray;
@end
@implementation TestReturnNotOwnedWhenExpectedOwned
- (NSString*)newString {
NSString *s = [NSString stringWithUTF8String:"hello"];
// FIXME: Should this be an error anyway?
return s; // no-warning
NSString *s = [NSString stringWithUTF8String:"hello"]; // expected-warning{{Potential leak (when using garbage collection) of an object allocated on line 136 and stored into 's'}}
CFRetain(s);
return s;
}
- (CFMutableArrayRef)newArray{
return CFArrayCreateMutable(0, 10, &kCFTypeArrayCallBacks); // no-warning
}
@end