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

Gabor Horvath via cfe-commits cfe-commits at lists.llvm.org
Fri Sep 18 16:38:57 PDT 2015


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
 
+ at 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;
+}




More information about the cfe-commits mailing list