]> granicus.if.org Git - clang/commitdiff
[analyzer] Handle when the dynamic type is worse than the static type.
authorJordan Rose <jordan_rose@apple.com>
Wed, 12 Sep 2012 21:48:17 +0000 (21:48 +0000)
committerJordan Rose <jordan_rose@apple.com>
Wed, 12 Sep 2012 21:48:17 +0000 (21:48 +0000)
Currently we don't update the dynamic type of a C++ object when it is
cast. This can cause the situation above, where the static type of the
region is now known to be a subclass of the dynamic type.

Once we start updating DynamicTypeInfo in response to the various kinds
of casts in C++, we can re-add this assert to make sure we don't miss
any cases. This work is tracked by <rdar://problem/12287087>.

In -Asserts builds, we will simply not return any runtime definition
when our DynamicTypeInfo is known to be incorrect like this.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@163745 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/CallEvent.cpp

index 09ba21173ba5404ff53f37beb0ba6835f41a814b..7742d1b6b643f51a3e3634cc80509ced3a15dc25 100644 (file)
@@ -440,8 +440,15 @@ RuntimeDefinition CXXInstanceCall::getRuntimeDefinition() const {
     // some particularly nasty casting (e.g. casts to sister classes).
     // However, we should at least be able to search up and down our own class
     // hierarchy, and some real bugs have been caught by checking this.
-    assert(!MD->getParent()->isDerivedFrom(RD) && "Bad DynamicTypeInfo");
     assert(!RD->isDerivedFrom(MD->getParent()) && "Couldn't find known method");
+    
+    // FIXME: This is checking that our DynamicTypeInfo is at least as good as
+    // the static type. However, because we currently don't update
+    // DynamicTypeInfo when an object is cast, we can't actually be sure the
+    // DynamicTypeInfo is up to date. This assert should be re-enabled once
+    // this is fixed. <rdar://problem/12287087>
+    //assert(!MD->getParent()->isDerivedFrom(RD) && "Bad DynamicTypeInfo");
+
     return RuntimeDefinition();
   }