forked from OSchip/llvm-project
Revert r99024, "Augment path diagnostics to include displaying when a message
expression", statistical evidence indicates it has some kind of memory error. llvm-svn: 99040
This commit is contained in:
parent
fe06df4bf3
commit
4e3e0991e9
|
@ -467,8 +467,6 @@ void registerTrackNullOrUndefValue(BugReporterContext& BRC, const void *stmt,
|
||||||
void registerFindLastStore(BugReporterContext& BRC, const void *memregion,
|
void registerFindLastStore(BugReporterContext& BRC, const void *memregion,
|
||||||
const ExplodedNode *N);
|
const ExplodedNode *N);
|
||||||
|
|
||||||
void registerNilReceiverVisitor(BugReporterContext &BRC);
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace clang::bugreporter
|
} // end namespace clang::bugreporter
|
||||||
|
|
||||||
|
|
|
@ -1613,9 +1613,7 @@ void GRBugReporter::GeneratePathDiagnostic(PathDiagnostic& PD,
|
||||||
else
|
else
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Register node visitors.
|
|
||||||
R->registerInitialVisitors(PDB, N);
|
R->registerInitialVisitors(PDB, N);
|
||||||
bugreporter::registerNilReceiverVisitor(PDB);
|
|
||||||
|
|
||||||
switch (PDB.getGenerationScheme()) {
|
switch (PDB.getGenerationScheme()) {
|
||||||
case PathDiagnosticClient::Extensive:
|
case PathDiagnosticClient::Extensive:
|
||||||
|
|
|
@ -103,6 +103,7 @@ public:
|
||||||
const ExplodedNode *Node = N, *Last = NULL;
|
const ExplodedNode *Node = N, *Last = NULL;
|
||||||
|
|
||||||
for ( ; Node ; Last = Node, Node = Node->getFirstPred()) {
|
for ( ; Node ; Last = Node, Node = Node->getFirstPred()) {
|
||||||
|
|
||||||
if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
|
if (const VarRegion *VR = dyn_cast<VarRegion>(R)) {
|
||||||
if (const PostStmt *P = Node->getLocationAs<PostStmt>())
|
if (const PostStmt *P = Node->getLocationAs<PostStmt>())
|
||||||
if (const DeclStmt *DS = P->getStmtAs<DeclStmt>())
|
if (const DeclStmt *DS = P->getStmtAs<DeclStmt>())
|
||||||
|
@ -247,6 +248,7 @@ public:
|
||||||
// Check if in the previous state it was feasible for this constraint
|
// Check if in the previous state it was feasible for this constraint
|
||||||
// to *not* be true.
|
// to *not* be true.
|
||||||
if (PrevN->getState()->Assume(Constraint, !Assumption)) {
|
if (PrevN->getState()->Assume(Constraint, !Assumption)) {
|
||||||
|
|
||||||
isSatisfied = true;
|
isSatisfied = true;
|
||||||
|
|
||||||
// As a sanity check, make sure that the negation of the constraint
|
// As a sanity check, make sure that the negation of the constraint
|
||||||
|
@ -257,8 +259,8 @@ public:
|
||||||
|
|
||||||
// We found the transition point for the constraint. We now need to
|
// We found the transition point for the constraint. We now need to
|
||||||
// pretty-print the constraint. (work-in-progress)
|
// pretty-print the constraint. (work-in-progress)
|
||||||
llvm::SmallString<256> sbuf;
|
std::string sbuf;
|
||||||
llvm::raw_svector_ostream os(sbuf);
|
llvm::raw_string_ostream os(sbuf);
|
||||||
|
|
||||||
if (isa<Loc>(Constraint)) {
|
if (isa<Loc>(Constraint)) {
|
||||||
os << "Assuming pointer value is ";
|
os << "Assuming pointer value is ";
|
||||||
|
@ -363,48 +365,3 @@ void clang::bugreporter::registerFindLastStore(BugReporterContext& BRC,
|
||||||
|
|
||||||
BRC.addVisitor(new FindLastStoreBRVisitor(V, R));
|
BRC.addVisitor(new FindLastStoreBRVisitor(V, R));
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
|
||||||
class NilReceiverVisitor : public BugReporterVisitor {
|
|
||||||
public:
|
|
||||||
NilReceiverVisitor() {}
|
|
||||||
|
|
||||||
PathDiagnosticPiece* VisitNode(const ExplodedNode *N,
|
|
||||||
const ExplodedNode *PrevN,
|
|
||||||
BugReporterContext& BRC) {
|
|
||||||
|
|
||||||
const PostStmt *P = N->getLocationAs<PostStmt>();
|
|
||||||
if (!P)
|
|
||||||
return 0;
|
|
||||||
const ObjCMessageExpr *ME = P->getStmtAs<ObjCMessageExpr>();
|
|
||||||
if (!ME)
|
|
||||||
return 0;
|
|
||||||
const Expr *Receiver = ME->getReceiver();
|
|
||||||
if (!Receiver)
|
|
||||||
return 0;
|
|
||||||
const GRState *state = N->getState();
|
|
||||||
const SVal &V = state->getSVal(Receiver);
|
|
||||||
const DefinedOrUnknownSVal *DV = dyn_cast<DefinedOrUnknownSVal>(&V);
|
|
||||||
if (!DV)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
state = state->Assume(*DV, true);
|
|
||||||
if (state)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
// The receiver was nil, and hence the method was skipped.
|
|
||||||
// Register a BugReporterVisitor to issue a message telling us how
|
|
||||||
// the receiver was null.
|
|
||||||
bugreporter::registerTrackNullOrUndefValue(BRC, Receiver, N);
|
|
||||||
|
|
||||||
//Issue a message saying that the method was skipped.
|
|
||||||
PathDiagnosticLocation L(Receiver, BRC.getSourceManager());
|
|
||||||
return new PathDiagnosticEventPiece(L, "No method actually called "
|
|
||||||
"because the receiver is nil");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} // end anonymous namespace
|
|
||||||
|
|
||||||
void clang::bugreporter::registerNilReceiverVisitor(BugReporterContext &BRC) {
|
|
||||||
BRC.addVisitor(new NilReceiverVisitor());
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue