RedDocMD created this revision. RedDocMD added reviewers: NoQ, vsavchenko, xazax.hun, teemperor. Herald added subscribers: martong, rnkovacs. RedDocMD requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
This patch: - Fixes how the std-namespace test is written in SmartPtrModelling (now accounts for functions with no Decl available) - Adds the smart pointer checker flag check where it was missing Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D106296 Files: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp Index: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp +++ clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp @@ -249,8 +249,12 @@ } bool isStdOstreamOperatorCall(const CallEvent &Call) { - if (Call.getNumArgs() != 2 || - !Call.getDecl()->getDeclContext()->isStdNamespace()) + if (Call.getNumArgs() != 2) + return false; + const auto *Decl = Call.getDecl(); + if (!Decl) + return false; + if (!Decl->getDeclContext()->isStdNamespace()) return false; const auto *FC = dyn_cast<SimpleFunctionCall>(&Call); if (!FC) @@ -265,6 +269,17 @@ isStdBasicOstream(Call.getArgExpr(0)); } +static bool isPotentiallyComparisionOpCall(const CallEvent &Call) { + if (Call.getNumArgs() != 2) + return false; + const auto *Decl = Call.getDecl(); + if (!Decl) + return false; + if (!Decl->getDeclContext()->isStdNamespace()) + return false; + return smartptr::isStdSmartPtr(Call.getArgExpr(0)) || smartptr::isStdSmartPtr(Call.getArgExpr(1)); +} + bool SmartPtrModeling::evalCall(const CallEvent &Call, CheckerContext &C) const { @@ -272,14 +287,11 @@ // If any one of the arg is a unique_ptr, then // we can try this function - if (Call.getNumArgs() == 2 && - Call.getDecl()->getDeclContext()->isStdNamespace()) - if (smartptr::isStdSmartPtr(Call.getArgExpr(0)) || - smartptr::isStdSmartPtr(Call.getArgExpr(1))) - if (handleComparisionOp(Call, C)) - return true; - - if (isStdOstreamOperatorCall(Call)) + if (ModelSmartPtrDereference && isPotentiallyComparisionOpCall(Call)) + if (handleComparisionOp(Call, C)) + return true; + + if (ModelSmartPtrDereference && isStdOstreamOperatorCall(Call)) return handleOstreamOperator(Call, C); if (Call.isCalled(StdSwapCall)) {
Index: clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp =================================================================== --- clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp +++ clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp @@ -249,8 +249,12 @@ } bool isStdOstreamOperatorCall(const CallEvent &Call) { - if (Call.getNumArgs() != 2 || - !Call.getDecl()->getDeclContext()->isStdNamespace()) + if (Call.getNumArgs() != 2) + return false; + const auto *Decl = Call.getDecl(); + if (!Decl) + return false; + if (!Decl->getDeclContext()->isStdNamespace()) return false; const auto *FC = dyn_cast<SimpleFunctionCall>(&Call); if (!FC) @@ -265,6 +269,17 @@ isStdBasicOstream(Call.getArgExpr(0)); } +static bool isPotentiallyComparisionOpCall(const CallEvent &Call) { + if (Call.getNumArgs() != 2) + return false; + const auto *Decl = Call.getDecl(); + if (!Decl) + return false; + if (!Decl->getDeclContext()->isStdNamespace()) + return false; + return smartptr::isStdSmartPtr(Call.getArgExpr(0)) || smartptr::isStdSmartPtr(Call.getArgExpr(1)); +} + bool SmartPtrModeling::evalCall(const CallEvent &Call, CheckerContext &C) const { @@ -272,14 +287,11 @@ // If any one of the arg is a unique_ptr, then // we can try this function - if (Call.getNumArgs() == 2 && - Call.getDecl()->getDeclContext()->isStdNamespace()) - if (smartptr::isStdSmartPtr(Call.getArgExpr(0)) || - smartptr::isStdSmartPtr(Call.getArgExpr(1))) - if (handleComparisionOp(Call, C)) - return true; - - if (isStdOstreamOperatorCall(Call)) + if (ModelSmartPtrDereference && isPotentiallyComparisionOpCall(Call)) + if (handleComparisionOp(Call, C)) + return true; + + if (ModelSmartPtrDereference && isStdOstreamOperatorCall(Call)) return handleOstreamOperator(Call, C); if (Call.isCalled(StdSwapCall)) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits