From 15e4b7d52704b45df776995df275fe62f24aac1a Mon Sep 17 00:00:00 2001 From: Csaba Dabis Date: Wed, 29 May 2019 20:18:07 +0000 Subject: [PATCH] [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 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@362025 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Core/BugReporter/BugReporterVisitors.h | 12 ++++ .../Core/BugReporterVisitors.cpp | 59 ++++++++++--------- 2 files changed, 44 insertions(+), 27 deletions(-) diff --git a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h index 6efe6fbfd0..36372dacd3 100644 --- a/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h +++ b/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h @@ -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, diff --git a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index d6eb31d6c4..fb5b375082 100644 --- a/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -2190,17 +2190,7 @@ std::shared_ptr 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 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 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 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 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 = -- 2.40.0