diff options
Diffstat (limited to 'lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp')
| -rw-r--r-- | lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp | 26 | 
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp index 62c54fc956a9..fc57cecac9cb 100644 --- a/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp +++ b/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp @@ -454,12 +454,12 @@ static Optional<NonLoc> tryRearrange(ProgramStateRef State,    QualType SingleTy;    auto &Opts = -    StateMgr.getOwningEngine()->getAnalysisManager().getAnalyzerOptions(); +    StateMgr.getOwningEngine().getAnalysisManager().getAnalyzerOptions();    // FIXME: After putting complexity threshold to the symbols we can always    //        rearrange additive operations but rearrange comparisons only if    //        option is set. -  if(!Opts.shouldAggressivelySimplifyBinaryOperation()) +  if(!Opts.ShouldAggressivelySimplifyBinaryOperation)      return None;    SymbolRef LSym = Lhs.getAsSymbol(); @@ -475,9 +475,6 @@ static Optional<NonLoc> tryRearrange(ProgramStateRef State,      SingleTy = ResultTy;      if (LSym->getType() != SingleTy)        return None; -    // Substracting unsigned integers is a nightmare. -    if (!SingleTy->isSignedIntegerOrEnumerationType()) -      return None;    } else {      // Don't rearrange other operations.      return None; @@ -485,6 +482,10 @@ static Optional<NonLoc> tryRearrange(ProgramStateRef State,    assert(!SingleTy.isNull() && "We should have figured out the type by now!"); +  // Rearrange signed symbolic expressions only +  if (!SingleTy->isSignedIntegerOrEnumerationType()) +    return None; +    SymbolRef RSym = Rhs.getAsSymbol();    if (!RSym || RSym->getType() != SingleTy)      return None; @@ -534,7 +535,7 @@ SVal SimpleSValBuilder::evalBinOpNN(ProgramStateRef state,    while (1) {      switch (lhs.getSubKind()) {      default: -      return makeSymExprValNN(state, op, lhs, rhs, resultTy); +      return makeSymExprValNN(op, lhs, rhs, resultTy);      case nonloc::PointerToMemberKind: {        assert(rhs.getSubKind() == nonloc::PointerToMemberKind &&               "Both SVals should have pointer-to-member-type"); @@ -582,7 +583,7 @@ SVal SimpleSValBuilder::evalBinOpNN(ProgramStateRef state,                return makeTruthVal(true, resultTy);              default:                // This case also handles pointer arithmetic. -              return makeSymExprValNN(state, op, InputLHS, InputRHS, resultTy); +              return makeSymExprValNN(op, InputLHS, InputRHS, resultTy);            }        }      } @@ -624,7 +625,7 @@ SVal SimpleSValBuilder::evalBinOpNN(ProgramStateRef state,        case BO_LE:        case BO_GE:          op = BinaryOperator::reverseComparisonOp(op); -        // FALL-THROUGH +        LLVM_FALLTHROUGH;        case BO_EQ:        case BO_NE:        case BO_Add: @@ -638,14 +639,14 @@ SVal SimpleSValBuilder::evalBinOpNN(ProgramStateRef state,          // (~0)>>a          if (LHSValue.isAllOnesValue() && LHSValue.isSigned())            return evalCastFromNonLoc(lhs, resultTy); -        // FALL-THROUGH +        LLVM_FALLTHROUGH;        case BO_Shl:          // 0<<a and 0>>a          if (LHSValue == 0)            return evalCastFromNonLoc(lhs, resultTy); -        return makeSymExprValNN(state, op, InputLHS, InputRHS, resultTy); +        return makeSymExprValNN(op, InputLHS, InputRHS, resultTy);        default: -        return makeSymExprValNN(state, op, InputLHS, InputRHS, resultTy); +        return makeSymExprValNN(op, InputLHS, InputRHS, resultTy);        }      }      case nonloc::SymbolValKind: { @@ -757,7 +758,7 @@ SVal SimpleSValBuilder::evalBinOpNN(ProgramStateRef state,          return *V;        // Give up -- this is not a symbolic expression we can handle. -      return makeSymExprValNN(state, op, InputLHS, InputRHS, resultTy); +      return makeSymExprValNN(op, InputLHS, InputRHS, resultTy);      }      }    } @@ -1201,6 +1202,7 @@ SVal SimpleSValBuilder::evalBinOpLN(ProgramStateRef state,  const llvm::APSInt *SimpleSValBuilder::getKnownValue(ProgramStateRef state,                                                     SVal V) { +  V = simplifySVal(state, V);    if (V.isUnknownOrUndef())      return nullptr;  | 
