[analyzer] pr31226: Disable CastSizeChecker in C++ because it's not quite ready.
Avoids a crash and a related false positive. Investigation by Daniel Krupp! llvm-svn: 288914
This commit is contained in:
parent
ff79f31328
commit
d69e01297f
|
@ -140,5 +140,10 @@ void CastSizeChecker::checkPreStmt(const CastExpr *CE,CheckerContext &C) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ento::registerCastSizeChecker(CheckerManager &mgr) {
|
void ento::registerCastSizeChecker(CheckerManager &mgr) {
|
||||||
|
// 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>();
|
mgr.registerChecker<CastSizeChecker>();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
typedef __typeof(sizeof(int)) size_t;
|
||||||
void *malloc(size_t);
|
void *malloc(size_t);
|
||||||
|
@ -106,3 +107,21 @@ void fooNested(const char* name) {
|
||||||
char* getterName = strdup(name);
|
char* getterName = strdup(name);
|
||||||
appendWrapperNested(getterName); // no-warning
|
appendWrapperNested(getterName); // no-warning
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue