Author: xazax Date: Fri Sep 18 18:38:57 2015 New Revision: 248065 URL: http://llvm.org/viewvc/llvm-project?rev=248065&view=rev Log: [Static Analyzer] Fixed a false positive case in DynamicTypeChecker when dealing with forward declarations.
Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp cfe/trunk/test/Analysis/dynamic_type_check.m Modified: cfe/trunk/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp?rev=248065&r1=248064&r2=248065&view=diff ============================================================================== --- cfe/trunk/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp (original) +++ cfe/trunk/lib/StaticAnalyzer/Checkers/DynamicTypeChecker.cpp Fri Sep 18 18:38:57 2015 @@ -151,6 +151,14 @@ PathDiagnosticPiece *DynamicTypeChecker: 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? void DynamicTypeChecker::checkPostStmt(const ImplicitCastExpr *CE, CheckerContext &C) const { @@ -177,6 +185,9 @@ void DynamicTypeChecker::checkPostStmt(c if (!DynObjCType || !StaticObjCType) return; + if (!hasDefinition(DynObjCType) || !hasDefinition(StaticObjCType)) + return; + ASTContext &ASTCtxt = C.getASTContext(); // Strip kindeofness to correctly detect subtyping relationships. Modified: cfe/trunk/test/Analysis/dynamic_type_check.m URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/dynamic_type_check.m?rev=248065&r1=248064&r2=248065&view=diff ============================================================================== --- cfe/trunk/test/Analysis/dynamic_type_check.m (original) +++ cfe/trunk/test/Analysis/dynamic_type_check.m Fri Sep 18 18:38:57 2015 @@ -26,8 +26,18 @@ __attribute__((objc_root_class)) @interface NSNumber : NSObject <NSCopying> @end +@class MyType; + void testTypeCheck(NSString* str) { id obj = str; NSNumber *num = obj; // expected-warning {{}} (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; +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits