[analyzer] pr31226: Disable CastSizeChecker in C++ because it's not quite ready.
authorArtem Dergachev <artem.dergachev@gmail.com>
Wed, 7 Dec 2016 16:12:26 +0000 (16:12 +0000)
committerArtem Dergachev <artem.dergachev@gmail.com>
Wed, 7 Dec 2016 16:12:26 +0000 (16:12 +0000)
Avoids a crash and a related false positive.

Investigation by Daniel Krupp!

llvm-svn: 288914

clang/lib/StaticAnalyzer/Checkers/CastSizeChecker.cpp
clang/test/Analysis/malloc.cpp

index 2337400..3e17815 100644 (file)
@@ -140,5 +140,10 @@ void CastSizeChecker::checkPreStmt(const CastExpr *CE,CheckerContext &C) const {
 }
 
 void ento::registerCastSizeChecker(CheckerManager &mgr) {
-  mgr.registerChecker<CastSizeChecker>();
+  // PR31226: C++ is more complicated than what this checker currently supports.
+  // There are derived-to-base casts, there are different rules for 0-size
+  // structures, no flexible arrays, etc.
+  // FIXME: Disabled on C++ for now.
+  if (!mgr.getLangOpts().CPlusPlus)
+    mgr.registerChecker<CastSizeChecker>();
 }
index 75d06d6..f24ccf5 100644 (file)
@@ -1,4 +1,5 @@
-// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc -analyzer-store=region -verify %s
+// RUN: %clang_cc1 -w -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc,cplusplus.NewDelete -analyzer-store=region -verify %s
+// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -w -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc,cplusplus.NewDelete -analyzer-store=region -verify %s
 
 typedef __typeof(sizeof(int)) size_t;
 void *malloc(size_t);
@@ -105,4 +106,22 @@ void appendWrapperNested(char *getterName) {
 void fooNested(const char* name) {
   char* getterName = strdup(name);
   appendWrapperNested(getterName); // no-warning
-}
\ No newline at end of file
+}
+
+namespace PR31226 {
+  struct b2 {
+    int f;
+  };
+
+  struct b1 : virtual b2 {
+    void m();
+  };
+
+  struct d : b1, b2 {
+  };
+
+  void f() {
+    d *p = new d();
+    p->m(); // no-crash // no-warning
+  }
+}