]> granicus.if.org Git - clang/commitdiff
[analyzer] Better test cases for explaining where tracking types of
authorAnna Zaks <ganna@apple.com>
Wed, 11 Apr 2012 22:20:05 +0000 (22:20 +0000)
committerAnna Zaks <ganna@apple.com>
Wed, 11 Apr 2012 22:20:05 +0000 (22:20 +0000)
symbolic regions would help.

Thanks to Richard Smith.

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

test/Analysis/dynamic-cast.cpp

index 8d1fde8cc5c1563cfe585cc00beac79b22349c5e..62481e36357f0777e9586b2805a531d7be001711 100644 (file)
@@ -181,13 +181,43 @@ int testReferenceFailedCast() {
   return *x; // no warning (An exception is thrown by the cast.)
 }
 
-// False negatives.
+// Here we allow any outcome of the cast and this is good because there is a
+// situation where this will fail. So if the user has written the code in this
+// way, we assume they expect the cast to succeed.
+// Note, this might need special handling if we track types of symbolic casts
+// and use them for dynamic_cast handling.
+int testDynCastMostLikelyWillFail(C *c) {
+  B *b = 0;
+  b = dynamic_cast<B*>(c);
+  const int* res = 0;
+  static const int i = 5;
+  if (b) {
+      res = &i;
+  } else {
+      res = 0;
+  }
+  return *res; // expected-warning{{Dereference of null pointer}}
+}
 
-// Symbolic regions are not typed, so we cannot deduce that the cast will
-// always fail in this case.
-int testDynCastFail1(class C *c) {
+class M : public B, public C {};
+void callTestDynCastMostLikelyWillFail() {
+  M m;
+  testDynCastMostLikelyWillFail(&m);
+}
+
+// False positives/negatives.
+
+// Due to symbolic regions not being typed.
+int testDynCastFalsePositive(BB *c) {
   B *b = 0;
   b = dynamic_cast<B*>(c);
-  return b->m;
+  const int* res = 0;
+  static const int i = 5;
+  if (b) {
+      res = &i;
+  } else {
+      res = 0;
+  }
+  return *res; // expected-warning{{Dereference of null pointer}}
 }