зеркало из https://github.com/microsoft/clang-1.git
Teach the analyzer about CXXScaleValueInitExpr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@156369 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
fad5de9d67
Коммит
c319c585c0
|
@ -71,6 +71,11 @@ SVal Environment::getSVal(const EnvironmentEntry &Entry,
|
|||
else
|
||||
return svalBuilder.makeBoolVal(cast<CXXBoolLiteralExpr>(E));
|
||||
}
|
||||
case Stmt::CXXScalarValueInitExprClass:
|
||||
case Stmt::ImplicitValueInitExprClass: {
|
||||
QualType Ty = cast<Expr>(E)->getType();
|
||||
return svalBuilder.makeZeroVal(Ty);
|
||||
}
|
||||
case Stmt::IntegerLiteralClass: {
|
||||
// In C++, this expression may have been bound to a temporary object.
|
||||
SVal const *X = ExprBindings.lookup(EnvironmentEntry(E, LCtx));
|
||||
|
|
|
@ -496,7 +496,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|||
case Stmt::CXXTypeidExprClass:
|
||||
case Stmt::CXXUuidofExprClass:
|
||||
case Stmt::CXXUnresolvedConstructExprClass:
|
||||
case Stmt::CXXScalarValueInitExprClass:
|
||||
case Stmt::DependentScopeDeclRefExprClass:
|
||||
case Stmt::UnaryTypeTraitExprClass:
|
||||
case Stmt::BinaryTypeTraitExprClass:
|
||||
|
@ -573,15 +572,6 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|||
// Implicitly handled by Environment::getSVal().
|
||||
break;
|
||||
|
||||
case Stmt::ImplicitValueInitExprClass: {
|
||||
ProgramStateRef state = Pred->getState();
|
||||
QualType ty = cast<ImplicitValueInitExpr>(S)->getType();
|
||||
SVal val = svalBuilder.makeZeroVal(ty);
|
||||
Bldr.generateNode(S, Pred, state->BindExpr(S, Pred->getLocationContext(),
|
||||
val));
|
||||
break;
|
||||
}
|
||||
|
||||
case Stmt::ExprWithCleanupsClass:
|
||||
// Handled due to fully linearised CFG.
|
||||
break;
|
||||
|
@ -619,6 +609,8 @@ void ExprEngine::Visit(const Stmt *S, ExplodedNode *Pred,
|
|||
case Stmt::AddrLabelExprClass:
|
||||
case Stmt::IntegerLiteralClass:
|
||||
case Stmt::CharacterLiteralClass:
|
||||
case Stmt::ImplicitValueInitExprClass:
|
||||
case Stmt::CXXScalarValueInitExprClass:
|
||||
case Stmt::CXXBoolLiteralExprClass:
|
||||
case Stmt::ObjCBoolLiteralExprClass:
|
||||
case Stmt::FloatingLiteralClass:
|
||||
|
|
|
@ -578,3 +578,17 @@ void rdar10924675(unsigned short x[], int index, int index2) {
|
|||
if (y == 0)
|
||||
return;
|
||||
}
|
||||
|
||||
// Test handling CXXScalarValueInitExprs.
|
||||
void rdar11401827() {
|
||||
int x = int();
|
||||
if (!x) {
|
||||
int *p = 0;
|
||||
*p = 0xDEADBEEF; // expected-warning {{null pointer}}
|
||||
}
|
||||
else {
|
||||
int *p = 0;
|
||||
*p = 0xDEADBEEF;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче