forked from OSchip/llvm-project
[analyzer] Ensure that the node NilReceiverBRVisitor is looking for is not reclaimed
The visitor should look for the PreStmt node as the receiver is nil in the PreStmt and this is the node. Also, tag the nil receiver nodes with a special tag for consistency. llvm-svn: 178152
This commit is contained in:
parent
0f06b98387
commit
22fa6ecc14
|
@ -155,9 +155,10 @@ private:
|
|||
|
||||
};
|
||||
|
||||
/// \class NilReceiverBRVisitor
|
||||
/// \brief Prints path notes when a message is sent to a nil receiver.
|
||||
class NilReceiverBRVisitor
|
||||
: public BugReporterVisitorImpl<NilReceiverBRVisitor>
|
||||
{
|
||||
: public BugReporterVisitorImpl<NilReceiverBRVisitor> {
|
||||
public:
|
||||
void Profile(llvm::FoldingSetNodeID &ID) const {
|
||||
static int x = 0;
|
||||
|
|
|
@ -397,6 +397,7 @@ void CallAndMessageChecker::HandleNilReceiver(CheckerContext &C,
|
|||
ProgramStateRef state,
|
||||
const ObjCMethodCall &Msg) const {
|
||||
ASTContext &Ctx = C.getASTContext();
|
||||
static SimpleProgramPointTag Tag("CallAndMessageChecker : NilReceiver");
|
||||
|
||||
// Check the return type of the message expression. A message to nil will
|
||||
// return different values depending on the return type and the architecture.
|
||||
|
@ -407,7 +408,7 @@ void CallAndMessageChecker::HandleNilReceiver(CheckerContext &C,
|
|||
if (CanRetTy->isStructureOrClassType()) {
|
||||
// Structure returns are safe since the compiler zeroes them out.
|
||||
SVal V = C.getSValBuilder().makeZeroVal(RetTy);
|
||||
C.addTransition(state->BindExpr(Msg.getOriginExpr(), LCtx, V));
|
||||
C.addTransition(state->BindExpr(Msg.getOriginExpr(), LCtx, V), &Tag);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -425,7 +426,7 @@ void CallAndMessageChecker::HandleNilReceiver(CheckerContext &C,
|
|||
Ctx.LongDoubleTy == CanRetTy ||
|
||||
Ctx.LongLongTy == CanRetTy ||
|
||||
Ctx.UnsignedLongLongTy == CanRetTy))) {
|
||||
if (ExplodedNode *N = C.generateSink(state))
|
||||
if (ExplodedNode *N = C.generateSink(state, 0 , &Tag))
|
||||
emitNilReceiverBug(C, Msg, N);
|
||||
return;
|
||||
}
|
||||
|
@ -444,7 +445,7 @@ void CallAndMessageChecker::HandleNilReceiver(CheckerContext &C,
|
|||
// of this case unless we have *a lot* more knowledge.
|
||||
//
|
||||
SVal V = C.getSValBuilder().makeZeroVal(RetTy);
|
||||
C.addTransition(state->BindExpr(Msg.getOriginExpr(), LCtx, V));
|
||||
C.addTransition(state->BindExpr(Msg.getOriginExpr(), LCtx, V), &Tag);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -981,7 +981,7 @@ PathDiagnosticPiece *NilReceiverBRVisitor::VisitNode(const ExplodedNode *N,
|
|||
const ExplodedNode *PrevN,
|
||||
BugReporterContext &BRC,
|
||||
BugReport &BR) {
|
||||
Optional<PostStmt> P = N->getLocationAs<PostStmt>();
|
||||
Optional<PreStmt> P = N->getLocationAs<PreStmt>();
|
||||
if (!P)
|
||||
return 0;
|
||||
const ObjCMessageExpr *ME = P->getStmtAs<ObjCMessageExpr>();
|
||||
|
|
Loading…
Reference in New Issue