diff options
-rw-r--r-- | clang/include/clang/Analysis/PathSensitive/RValues.h | 2 | ||||
-rw-r--r-- | clang/lib/Analysis/GRSimpleVals.cpp | 7 | ||||
-rw-r--r-- | clang/lib/Analysis/RValues.cpp | 14 |
3 files changed, 22 insertions, 1 deletions
diff --git a/clang/include/clang/Analysis/PathSensitive/RValues.h b/clang/include/clang/Analysis/PathSensitive/RValues.h index 5a010dd0dc8..884f467aef4 100644 --- a/clang/include/clang/Analysis/PathSensitive/RValues.h +++ b/clang/include/clang/Analysis/PathSensitive/RValues.h @@ -83,6 +83,8 @@ public: return getRawKind() > UnknownKind; } + bool isZeroConstant() const; + void print(std::ostream& OS) const; void printStdErr() const; diff --git a/clang/lib/Analysis/GRSimpleVals.cpp b/clang/lib/Analysis/GRSimpleVals.cpp index 6cb714a86e1..36e7233f25f 100644 --- a/clang/lib/Analysis/GRSimpleVals.cpp +++ b/clang/lib/Analysis/GRSimpleVals.cpp @@ -472,11 +472,16 @@ RVal GRSimpleVals::DetermEvalBinOpNN(ValueStateManager& StateMgr, return UnknownVal(); case nonlval::SymIntConstraintValKind: { + + // Logical not? + if (!(Op == BinaryOperator::EQ && R.isZeroConstant())) + return UnknownVal(); + const SymIntConstraint& C = cast<nonlval::SymIntConstraintVal>(L).getConstraint(); BinaryOperator::Opcode Opc = C.getOpcode(); - + if (Opc < BinaryOperator::LT || Opc > BinaryOperator::NE) return UnknownVal(); diff --git a/clang/lib/Analysis/RValues.cpp b/clang/lib/Analysis/RValues.cpp index 60c349420a3..ed3dba925eb 100644 --- a/clang/lib/Analysis/RValues.cpp +++ b/clang/lib/Analysis/RValues.cpp @@ -55,6 +55,20 @@ RVal::symbol_iterator RVal::symbol_end() const { } //===----------------------------------------------------------------------===// +// Useful predicates. +//===----------------------------------------------------------------------===// + +bool RVal::isZeroConstant() const { + if (isa<lval::ConcreteInt>(*this)) + return cast<lval::ConcreteInt>(*this).getValue() == 0; + else if (isa<nonlval::ConcreteInt>(*this)) + return cast<nonlval::ConcreteInt>(*this).getValue() == 0; + else + return false; +} + + +//===----------------------------------------------------------------------===// // Transfer function dispatch for Non-LVals. //===----------------------------------------------------------------------===// |