]> granicus.if.org Git - clang/commitdiff
[analyzer] Fix crash when analyzing C++ code.
authorArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 19 Feb 2011 01:59:41 +0000 (01:59 +0000)
committerArgyrios Kyrtzidis <akyrtzi@gmail.com>
Sat, 19 Feb 2011 01:59:41 +0000 (01:59 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@126013 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/StaticAnalyzer/Core/PathSensitive/SValBuilder.h
lib/StaticAnalyzer/Core/Environment.cpp
test/Analysis/cxx-crashes.cpp

index e7b39448ac554d5054b281be1a148e2130f8cca0..fc2b76e04a66ae7c48ca798d372103b202626e26 100644 (file)
@@ -172,9 +172,8 @@ public:
                                         I->getType()->isUnsignedIntegerType()));
   }
 
-  nonloc::ConcreteInt makeIntVal(const CXXBoolLiteralExpr *E) {
-    return E->getValue() ? nonloc::ConcreteInt(BasicVals.getValue(1, 1, true))
-                         : nonloc::ConcreteInt(BasicVals.getValue(0, 1, true));
+  nonloc::ConcreteInt makeBoolVal(const CXXBoolLiteralExpr *E) {
+    return makeTruthVal(E->getValue());
   }
 
   nonloc::ConcreteInt makeIntVal(const llvm::APSInt& V) {
@@ -218,11 +217,11 @@ public:
   NonLoc makeNonLoc(const SymExpr *lhs, BinaryOperator::Opcode op,
                     const SymExpr *rhs, QualType T);
 
-  NonLoc makeTruthVal(bool b, QualType T) {
+  nonloc::ConcreteInt makeTruthVal(bool b, QualType T) {
     return nonloc::ConcreteInt(BasicVals.getTruthValue(b, T));
   }
 
-  NonLoc makeTruthVal(bool b) {
+  nonloc::ConcreteInt makeTruthVal(bool b) {
     return nonloc::ConcreteInt(BasicVals.getTruthValue(b));
   }
 
index 33f1945ce759042496a8804842ec654db66b7a99..ecaff295b390047d8b1b6149592896efd1fd04e2 100644 (file)
@@ -45,7 +45,7 @@ SVal Environment::getSVal(const Stmt *E, SValBuilder& svalBuilder) const {
         if (X) 
           return *X;
         else 
-          return svalBuilder.makeIntVal(cast<CXXBoolLiteralExpr>(E));
+          return svalBuilder.makeBoolVal(cast<CXXBoolLiteralExpr>(E));
       }
       case Stmt::IntegerLiteralClass: {
         // In C++, this expression may have been bound to a temporary object.
index c15eea862e7a254a39b86feeecb9b426fc606acf..cebc55bd4239792b541c3a139361e7d9c75c5386 100644 (file)
@@ -10,6 +10,10 @@ long f2(char *c) {
   return long(c) & 1;
 }
 
+bool f3() {
+  return !false;
+}
+
 namespace {
 
 struct A { };