summaryrefslogtreecommitdiffstats
path: root/clang/Analysis/RValues.cpp
diff options
context:
space:
mode:
authorTed Kremenek <kremenek@apple.com>2008-02-28 20:32:03 +0000
committerTed Kremenek <kremenek@apple.com>2008-02-28 20:32:03 +0000
commite0c79380cd050409bf372eacbcd21b44ebb3c9c5 (patch)
tree89626689cd8087398956b5fdb68e050aed1381f5 /clang/Analysis/RValues.cpp
parent9781aee03c78a4f260bb9fa8a227eab601efcf60 (diff)
downloadbcm5719-llvm-e0c79380cd050409bf372eacbcd21b44ebb3c9c5.tar.gz
bcm5719-llvm-e0c79380cd050409bf372eacbcd21b44ebb3c9c5.zip
Added checking for undefined results of '<<' and '>>' (shifting by too many bits, etc.)
This current implementation only works when both operands are concrete values; later we will add support for symbolic values. llvm-svn: 47726
Diffstat (limited to 'clang/Analysis/RValues.cpp')
-rw-r--r--clang/Analysis/RValues.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/clang/Analysis/RValues.cpp b/clang/Analysis/RValues.cpp
index d7c4dac252b..6369da4d7ff 100644
--- a/clang/Analysis/RValues.cpp
+++ b/clang/Analysis/RValues.cpp
@@ -48,11 +48,16 @@ RVal::symbol_iterator RVal::symbol_end() const {
// Transfer function dispatch for Non-LVals.
//===----------------------------------------------------------------------===//
-nonlval::ConcreteInt
+RVal
nonlval::ConcreteInt::EvalBinOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
const nonlval::ConcreteInt& R) const {
- return ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue());
+ const llvm::APSInt* X = ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue());
+
+ if (X)
+ return nonlval::ConcreteInt(*X);
+ else
+ return UndefinedVal();
}
@@ -76,14 +81,19 @@ nonlval::ConcreteInt::EvalMinus(ValueManager& ValMgr, UnaryOperator* U) const {
// Transfer function dispatch for LVals.
//===----------------------------------------------------------------------===//
-lval::ConcreteInt
+RVal
lval::ConcreteInt::EvalBinOp(ValueManager& ValMgr, BinaryOperator::Opcode Op,
const lval::ConcreteInt& R) const {
assert (Op == BinaryOperator::Add || Op == BinaryOperator::Sub ||
(Op >= BinaryOperator::LT && Op <= BinaryOperator::NE));
- return ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue());
+ const llvm::APSInt* X = ValMgr.EvaluateAPSInt(Op, getValue(), R.getValue());
+
+ if (X)
+ return lval::ConcreteInt(*X);
+ else
+ return UndefinedVal();
}
NonLVal LVal::EQ(ValueManager& ValMgr, const LVal& R) const {
OpenPOWER on IntegriCloud