summaryrefslogtreecommitdiffstats
path: root/clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp
diff options
context:
space:
mode:
authorArtem Dergachev <artem.dergachev@gmail.com>2019-06-19 23:33:42 +0000
committerArtem Dergachev <artem.dergachev@gmail.com>2019-06-19 23:33:42 +0000
commit44820630dfa45bc47748a5abda7d4a9cb86da2c1 (patch)
tree94cc27f4a5871fd5e86e8a8bb45dbdb158b765e5 /clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp
parent3707b05211f90f2d3b8f31d15b59e8f6c12f3b8b (diff)
downloadbcm5719-llvm-44820630dfa45bc47748a5abda7d4a9cb86da2c1.tar.gz
bcm5719-llvm-44820630dfa45bc47748a5abda7d4a9cb86da2c1.zip
[analyzer] NFC: Change evalCall() to provide a CallEvent.
This changes the checker callback signature to use the modern, easy to use interface. Additionally, this unblocks future work on allowing checkers to implement evalCall() for calls that don't correspond to any call-expression or require additional information that's only available as part of the CallEvent, such as C++ constructors and destructors. Differential Revision: https://reviews.llvm.org/D62440 llvm-svn: 363893
Diffstat (limited to 'clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp24
1 files changed, 11 insertions, 13 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp b/clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp
index 4b321f0f6aa..fd372aafa50 100644
--- a/clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/SmartPtrModeling.cpp
@@ -26,32 +26,30 @@ using namespace ento;
namespace {
class SmartPtrModeling : public Checker<eval::Call> {
- bool isNullAfterMoveMethod(const CXXInstanceCall *Call) const;
+ bool isNullAfterMoveMethod(const CallEvent &Call) const;
public:
- bool evalCall(const CallExpr *CE, CheckerContext &C) const;
+ bool evalCall(const CallEvent &Call, CheckerContext &C) const;
};
} // end of anonymous namespace
-bool SmartPtrModeling::isNullAfterMoveMethod(
- const CXXInstanceCall *Call) const {
+bool SmartPtrModeling::isNullAfterMoveMethod(const CallEvent &Call) const {
// TODO: Update CallDescription to support anonymous calls?
// TODO: Handle other methods, such as .get() or .release().
// But once we do, we'd need a visitor to explain null dereferences
// that are found via such modeling.
- const auto *CD = dyn_cast_or_null<CXXConversionDecl>(Call->getDecl());
+ const auto *CD = dyn_cast_or_null<CXXConversionDecl>(Call.getDecl());
return CD && CD->getConversionType()->isBooleanType();
}
-bool SmartPtrModeling::evalCall(const CallExpr *CE, CheckerContext &C) const {
- CallEventRef<> CallRef = C.getStateManager().getCallEventManager().getCall(
- CE, C.getState(), C.getLocationContext());
- const auto *Call = dyn_cast_or_null<CXXInstanceCall>(CallRef);
- if (!Call || !isNullAfterMoveMethod(Call))
+bool SmartPtrModeling::evalCall(const CallEvent &Call,
+ CheckerContext &C) const {
+ if (!isNullAfterMoveMethod(Call))
return false;
ProgramStateRef State = C.getState();
- const MemRegion *ThisR = Call->getCXXThisVal().getAsRegion();
+ const MemRegion *ThisR =
+ cast<CXXInstanceCall>(&Call)->getCXXThisVal().getAsRegion();
if (!move::isMovedFrom(State, ThisR)) {
// TODO: Model this case as well. At least, avoid invalidation of globals.
@@ -60,8 +58,8 @@ bool SmartPtrModeling::evalCall(const CallExpr *CE, CheckerContext &C) const {
// TODO: Add a note to bug reports describing this decision.
C.addTransition(
- State->BindExpr(CE, C.getLocationContext(),
- C.getSValBuilder().makeZeroVal(CE->getType())));
+ State->BindExpr(Call.getOriginExpr(), C.getLocationContext(),
+ C.getSValBuilder().makeZeroVal(Call.getResultType())));
return true;
}
OpenPOWER on IntegriCloud