Skip to content

Commit

Permalink
[analyzer] Extract NilReceiverHandler
Browse files Browse the repository at this point in the history
Differential Revision: https://reviews.llvm.org/D103902
  • Loading branch information
SavchenkoValeriy committed Jun 15, 2021
1 parent 85f475c commit 1639dcb
Showing 1 changed file with 19 additions and 7 deletions.
26 changes: 19 additions & 7 deletions clang/lib/StaticAnalyzer/Core/BugReporterVisitors.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2116,24 +2116,35 @@ class ControlDependencyHandler final : public ExpressionHandler {
}
};

class DefaultExpressionHandler final : public ExpressionHandler {
class NilReceiverHandler final : public ExpressionHandler {
public:
using ExpressionHandler::ExpressionHandler;

Tracker::Result handle(const Expr *Inner, const ExplodedNode *InputNode,
const ExplodedNode *LVNode,
TrackingOptions Opts) override {
ProgramStateRef LVState = LVNode->getState();
const StackFrameContext *SFC = LVNode->getStackFrame();
PathSensitiveBugReport &Report = getParentTracker().getReport();
Tracker::Result Result;

// The message send could be nil due to the receiver being nil.
// At this point in the path, the receiver should be live since we are at
// the message send expr. If it is nil, start tracking it.
if (const Expr *Receiver =
NilReceiverBRVisitor::getNilReceiver(Inner, LVNode))
Result.combineWith(getParentTracker().track(Receiver, LVNode, Opts));
return getParentTracker().track(Receiver, LVNode, Opts);

return {};
}
};

class DefaultExpressionHandler final : public ExpressionHandler {
public:
using ExpressionHandler::ExpressionHandler;

Tracker::Result handle(const Expr *Inner, const ExplodedNode *InputNode,
const ExplodedNode *LVNode,
TrackingOptions Opts) override {
ProgramStateRef LVState = LVNode->getState();
const StackFrameContext *SFC = LVNode->getStackFrame();
PathSensitiveBugReport &Report = getParentTracker().getReport();
Tracker::Result Result;

// Track the index if this is an array subscript.
if (const auto *Arr = dyn_cast<ArraySubscriptExpr>(Inner))
Expand Down Expand Up @@ -2308,6 +2319,7 @@ class PRValueHandler final : public ExpressionHandler {
Tracker::Tracker(PathSensitiveBugReport &Report) : Report(Report) {
// Default expression handlers.
addLowPriorityHandler<ControlDependencyHandler>();
addLowPriorityHandler<NilReceiverHandler>();
addLowPriorityHandler<DefaultExpressionHandler>();
addLowPriorityHandler<PRValueHandler>();
// Default store handlers.
Expand Down

0 comments on commit 1639dcb

Please sign in to comment.