[analyzer] ConditionBRVisitor: Remove duplicated code

Summary: -

Reviewers: NoQ, george.karpenkov

Reviewed By: NoQ

Subscribers: cfe-commits, xazax.hun, baloghadamsoftware, szepet, a.sidorin,
             mikhail.ramalho, Szelethus, donat.nagy, dkrupp

Tags: #clang

Differential Revision: https://reviews.llvm.org/D58199

llvm-svn: 362025
This commit is contained in:
Csaba Dabis 2019-05-29 20:18:07 +00:00
parent 8193ea60f6
commit 9942a996d9
2 changed files with 44 additions and 27 deletions

View File

@ -207,6 +207,18 @@ public:
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,

View File

@ -2190,17 +2190,7 @@ std::shared_ptr<PathDiagnosticPiece> ConditionBRVisitor::VisitConditionVariable(
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 @@ std::shared_ptr<PathDiagnosticPiece> ConditionBRVisitor::VisitTrueTest(
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<const llvm::APSInt *> 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 @@ std::shared_ptr<PathDiagnosticPiece> ConditionBRVisitor::VisitTrueTest(
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<const llvm::APSInt *> 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 =