Index: cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h =================================================================== --- cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h +++ cfe/trunk/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h @@ -207,6 +207,18 @@ BugReporterContext &BRC, BugReport &R, const ExplodedNode *N, bool TookTrue); + /// Tries to print the value of the given expression. + /// + /// \param CondVarExpr The expression to print its value. + /// \param Out The stream to print. + /// \param N The node where we encountered the condition. + /// \param TookTrue Whether we took the \c true branch of the condition. + /// + /// \return Whether the print was successful. (The printing is successful if + /// we model the value and we could obtain it.) + bool printValue(const Expr *CondVarExpr, raw_ostream &Out, + const ExplodedNode *N, bool TookTrue, bool IsAssuming); + bool patternMatch(const Expr *Ex, const Expr *ParentEx, raw_ostream &Out, Index: cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp =================================================================== --- cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ cfe/trunk/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -2190,17 +2190,7 @@ llvm::raw_svector_ostream Out(buf); Out << "Assuming " << LhsString << " is "; - QualType Ty = CondVarExpr->getType(); - - if (Ty->isPointerType()) - Out << (TookTrue ? "not null" : "null"); - else if (Ty->isObjCObjectPointerType()) - Out << (TookTrue ? "not nil" : "nil"); - else if (Ty->isBooleanType()) - Out << (TookTrue ? "true" : "false"); - else if (Ty->isIntegralOrEnumerationType()) - Out << (TookTrue ? "non-zero" : "zero"); - else + if (!printValue(CondVarExpr, Out, N, TookTrue, /*IsAssuming=*/true)) return nullptr; const LocationContext *LCtx = N->getLocationContext(); @@ -2232,22 +2222,7 @@ Out << (IsAssuming ? "Assuming '" : "'") << VD->getDeclName() << "' is "; - QualType Ty = VD->getType(); - - if (Ty->isPointerType()) - Out << (TookTrue ? "non-null" : "null"); - else if (Ty->isObjCObjectPointerType()) - Out << (TookTrue ? "non-nil" : "nil"); - else if (Ty->isScalarType()) { - Optional IntValue; - if (!IsAssuming) - IntValue = getConcreteIntegerValue(DRE, N); - - if (IsAssuming || !IntValue.hasValue()) - Out << (TookTrue ? "not equal to 0" : "0"); - else - Out << *IntValue.getValue(); - } else + if (!printValue(DRE, Out, N, TookTrue, IsAssuming)) return nullptr; const LocationContext *LCtx = N->getLocationContext(); @@ -2271,6 +2246,36 @@ return std::move(event); } +bool ConditionBRVisitor::printValue(const Expr *CondVarExpr, raw_ostream &Out, + const ExplodedNode *N, bool TookTrue, + bool IsAssuming) { + QualType Ty = CondVarExpr->getType(); + + if (Ty->isPointerType()) { + Out << (TookTrue ? "non-null" : "null"); + return true; + } + + if (Ty->isObjCObjectPointerType()) { + Out << (TookTrue ? "non-nil" : "nil"); + return true; + } + + if (!Ty->isIntegralOrEnumerationType()) + return false; + + Optional IntValue; + if (!IsAssuming) + IntValue = getConcreteIntegerValue(CondVarExpr, N); + + if (IsAssuming || !IntValue.hasValue()) + Out << (TookTrue ? "not equal to 0" : "0"); + else + Out << *IntValue.getValue(); + + return true; +} + const char *const ConditionBRVisitor::GenericTrueMessage = "Assuming the condition is true"; const char *const ConditionBRVisitor::GenericFalseMessage =