diff options
-rw-r--r-- | lib/StaticAnalyzer/Core/SValBuilder.cpp | 33 | ||||
-rw-r--r-- | test/Analysis/svalbuilder-logic.c | 7 |
2 files changed, 23 insertions, 17 deletions
diff --git a/lib/StaticAnalyzer/Core/SValBuilder.cpp b/lib/StaticAnalyzer/Core/SValBuilder.cpp index 4ce9d09280..4c021a4a26 100644 --- a/lib/StaticAnalyzer/Core/SValBuilder.cpp +++ b/lib/StaticAnalyzer/Core/SValBuilder.cpp @@ -196,25 +196,24 @@ DefinedSVal SValBuilder::getBlockPointer(const BlockDecl *block, //===----------------------------------------------------------------------===// SVal SValBuilder::makeSymExprValNN(ProgramStateRef State, - BinaryOperator::Opcode Op, - NonLoc LHS, NonLoc RHS, - QualType ResultTy) { - const SymExpr *symLHS; - const SymExpr *symRHS; - - if (const nonloc::ConcreteInt *rInt = dyn_cast<nonloc::ConcreteInt>(&RHS)) { - symLHS = LHS.getAsSymExpr(); - return makeNonLoc(symLHS, Op, rInt->getValue(), ResultTy); - } + BinaryOperator::Opcode Op, + NonLoc LHS, NonLoc RHS, + QualType ResultTy) { + const SymExpr *symLHS = LHS.getAsSymExpr(); + const SymExpr *symRHS = RHS.getAsSymExpr(); - if (const nonloc::ConcreteInt *lInt = dyn_cast<nonloc::ConcreteInt>(&LHS)) { - symRHS = RHS.getAsSymExpr(); - return makeNonLoc(lInt->getValue(), Op, symRHS, ResultTy); - } + if (symLHS && symRHS) + return makeNonLoc(symLHS, Op, symRHS, ResultTy); + + if (symLHS) + if (const nonloc::ConcreteInt *rInt = dyn_cast<nonloc::ConcreteInt>(&RHS)) + return makeNonLoc(symLHS, Op, rInt->getValue(), ResultTy); - symLHS = LHS.getAsSymExpr(); - symRHS = RHS.getAsSymExpr(); - return makeNonLoc(symLHS, Op, symRHS, ResultTy); + if (symRHS) + if (const nonloc::ConcreteInt *lInt = dyn_cast<nonloc::ConcreteInt>(&LHS)) + return makeNonLoc(lInt->getValue(), Op, symRHS, ResultTy); + + return UnknownVal(); } diff --git a/test/Analysis/svalbuilder-logic.c b/test/Analysis/svalbuilder-logic.c new file mode 100644 index 0000000000..bc79f85905 --- /dev/null +++ b/test/Analysis/svalbuilder-logic.c @@ -0,0 +1,7 @@ +// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix -verify %s + +// Testing core functionality of the SValBuilder. + +int SValBuilderLogicNoCrash(int *x) { + return 3 - (int)(x +3); +} |