]> granicus.if.org Git - clang/commitdiff
[analyzer] Fix an assertion failure triggered by the analyzer buildbot.
authorAnna Zaks <ganna@apple.com>
Wed, 2 May 2012 00:05:23 +0000 (00:05 +0000)
committerAnna Zaks <ganna@apple.com>
Wed, 2 May 2012 00:05:23 +0000 (00:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@155964 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Core/SValBuilder.cpp
test/Analysis/svalbuilder-logic.c [new file with mode: 0644]

index 4ce9d09280f80ed32850f7c34fb812ed79f9d519..4c021a4a26c004f426a1f08419cbd91bf6877d6e 100644 (file)
@@ -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 (file)
index 0000000..bc79f85
--- /dev/null
@@ -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);
+}