diff options
author | Csaba Dabis <dabis.csaba98@gmail.com> | 2019-05-29 20:18:07 +0000 |
---|---|---|
committer | Csaba Dabis <dabis.csaba98@gmail.com> | 2019-05-29 20:18:07 +0000 |
commit | 9942a996d90228e489b2c93a5660b1ffbd1ffb34 (patch) | |
tree | 247078f18a113c52b49f795ae3ef77a2092aff07 | |
parent | 8193ea60f6a01319c1bae26ec186c2676f2ba5f8 (diff) | |
download | bcm5719-llvm-9942a996d90228e489b2c93a5660b1ffbd1ffb34.tar.gz bcm5719-llvm-9942a996d90228e489b2c93a5660b1ffbd1ffb34.zip |
[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
-rw-r--r-- | clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h | 12 | ||||
-rw-r--r-- | clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp | 59 |
2 files changed, 44 insertions, 27 deletions
diff --git a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h b/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h index 6efe6fbfd0e..36372dacd39 100644 --- a/clang/include/clang/StaticAnalyzer/Core/BugReporter/BugReporterVisitors.h +++ b/clang/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/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp index d6eb31d6c4e..fb5b3750823 100644 --- a/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp +++ b/clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp @@ -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 = |