Added more assertions and checks in transfer function logic to check for
UninitializedVals and UnknownVals.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47288 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/Analysis/GRSimpleVals.cpp b/Analysis/GRSimpleVals.cpp
index 58f0729..87b39b7 100644
--- a/Analysis/GRSimpleVals.cpp
+++ b/Analysis/GRSimpleVals.cpp
@@ -31,7 +31,7 @@
CheckerState->setTransferFunctions(GRSV);
// Execute the worklist algorithm.
- Engine.ExecuteWorkList(200);
+ Engine.ExecuteWorkList(10000);
// Look for explicit-Null dereferences and warn about them.
for (GRExprEngine::null_iterator I=CheckerState->null_begin(),
@@ -57,6 +57,8 @@
RValue GRSimpleVals::EvalCast(ValueManager& ValMgr, NonLValue X,
Expr* CastExpr) {
+ assert (!isa<UnknownVal>(X) && !isa<UninitializedVal>(X));
+
if (!isa<nonlval::ConcreteInt>(X))
return UnknownVal();
@@ -74,6 +76,8 @@
// Casts.
RValue GRSimpleVals::EvalCast(ValueManager& ValMgr, LValue X, Expr* CastExpr) {
+
+ assert (!isa<UnknownVal>(X) && !isa<UninitializedVal>(X));
if (CastExpr->getType()->isPointerType())
return X;
@@ -96,6 +100,8 @@
NonLValue GRSimpleVals::EvalMinus(ValueManager& ValMgr, UnaryOperator* U,
NonLValue X) {
+ assert (!isa<UnknownVal>(X) && !isa<UninitializedVal>(X));
+
switch (X.getSubKind()) {
case nonlval::ConcreteIntKind:
return cast<nonlval::ConcreteInt>(X).EvalMinus(ValMgr, U);
@@ -105,6 +111,9 @@
}
NonLValue GRSimpleVals::EvalComplement(ValueManager& ValMgr, NonLValue X) {
+
+ assert (!isa<UnknownVal>(X) && !isa<UninitializedVal>(X));
+
switch (X.getSubKind()) {
case nonlval::ConcreteIntKind:
return cast<nonlval::ConcreteInt>(X).EvalComplement(ValMgr);
@@ -119,11 +128,8 @@
BinaryOperator::Opcode Op,
NonLValue LHS, NonLValue RHS) {
- if (isa<UnknownVal>(LHS) || isa<UnknownVal>(RHS))
- return cast<NonLValue>(UnknownVal());
-
- if (isa<UninitializedVal>(LHS) || isa<UninitializedVal>(RHS))
- return cast<NonLValue>(UninitializedVal());
+ assert (!isa<UnknownVal>(LHS) && !isa<UninitializedVal>(LHS));
+ assert (!isa<UnknownVal>(RHS) && !isa<UninitializedVal>(RHS));
while(1) {
@@ -169,6 +175,9 @@
BinaryOperator::Opcode Op,
LValue LHS, LValue RHS) {
+ assert (!isa<UnknownVal>(LHS) && !isa<UninitializedVal>(LHS));
+ assert (!isa<UnknownVal>(RHS) && !isa<UninitializedVal>(RHS));
+
switch (Op) {
default:
return UnknownVal();
@@ -186,6 +195,10 @@
LValue GRSimpleVals::EvalBinaryOp(ValueManager& ValMgr,
BinaryOperator::Opcode Op,
LValue LHS, NonLValue RHS) {
+
+ assert (!isa<UnknownVal>(LHS) && !isa<UninitializedVal>(LHS));
+ assert (!isa<UnknownVal>(RHS) && !isa<UninitializedVal>(RHS));
+
return cast<LValue>(UnknownVal());
}
@@ -194,6 +207,9 @@
NonLValue GRSimpleVals::EvalEQ(ValueManager& ValMgr, LValue LHS, LValue RHS) {
+ assert (!isa<UnknownVal>(LHS) && !isa<UninitializedVal>(LHS));
+ assert (!isa<UnknownVal>(RHS) && !isa<UninitializedVal>(RHS));
+
switch (LHS.getSubKind()) {
default:
assert(false && "EQ not implemented for this LValue.");
@@ -249,6 +265,9 @@
}
NonLValue GRSimpleVals::EvalNE(ValueManager& ValMgr, LValue LHS, LValue RHS) {
+
+ assert (!isa<UnknownVal>(LHS) && !isa<UninitializedVal>(LHS));
+ assert (!isa<UnknownVal>(RHS) && !isa<UninitializedVal>(RHS));
switch (LHS.getSubKind()) {
default: