[Static Analyzer] Fixed a false positive case in DynamicTypeChecker when dealing with forward declarations.

llvm-svn: 248065
This commit is contained in:
Gabor Horvath 2015-09-18 23:38:57 +00:00
parent 324da7b207
commit 659842d0fc
2 changed files with 21 additions and 0 deletions

View File

@ -151,6 +151,14 @@ PathDiagnosticPiece *DynamicTypeChecker::DynamicTypeBugVisitor::VisitNode(
return new PathDiagnosticEventPiece(Pos, OS.str(), true, nullptr); return new PathDiagnosticEventPiece(Pos, OS.str(), true, nullptr);
} }
static bool hasDefinition(const ObjCObjectPointerType *ObjPtr) {
const ObjCInterfaceDecl *Decl = ObjPtr->getInterfaceDecl();
if (!Decl)
return false;
return Decl->getDefinition();
}
// TODO: consider checking explicit casts? // TODO: consider checking explicit casts?
void DynamicTypeChecker::checkPostStmt(const ImplicitCastExpr *CE, void DynamicTypeChecker::checkPostStmt(const ImplicitCastExpr *CE,
CheckerContext &C) const { CheckerContext &C) const {
@ -177,6 +185,9 @@ void DynamicTypeChecker::checkPostStmt(const ImplicitCastExpr *CE,
if (!DynObjCType || !StaticObjCType) if (!DynObjCType || !StaticObjCType)
return; return;
if (!hasDefinition(DynObjCType) || !hasDefinition(StaticObjCType))
return;
ASTContext &ASTCtxt = C.getASTContext(); ASTContext &ASTCtxt = C.getASTContext();
// Strip kindeofness to correctly detect subtyping relationships. // Strip kindeofness to correctly detect subtyping relationships.

View File

@ -26,8 +26,18 @@ __attribute__((objc_root_class))
@interface NSNumber : NSObject <NSCopying> @interface NSNumber : NSObject <NSCopying>
@end @end
@class MyType;
void testTypeCheck(NSString* str) { void testTypeCheck(NSString* str) {
id obj = str; id obj = str;
NSNumber *num = obj; // expected-warning {{}} NSNumber *num = obj; // expected-warning {{}}
(void)num; (void)num;
} }
void testForwardDeclarations(NSString* str) {
id obj = str;
// Do not warn, since no information is available wether MyType is a sub or
// super class of any other type.
MyType *num = obj; // no warning
(void)num;
}