diff --git a/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.cpp --- a/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIChecker.cpp @@ -43,6 +43,9 @@ // double nonblocking detected if (Req && Req->CurrentState == Request::State::Nonblocking) { ExplodedNode *ErrorNode = Ctx.generateNonFatalErrorNode(); + if (!ErrorNode) + return; + BReporter.reportDoubleNonblocking(PreCallEvent, *Req, MR, ErrorNode, Ctx.getBugReporter()); Ctx.addTransition(ErrorNode->getState(), ErrorNode); @@ -83,6 +86,9 @@ if (!Req) { if (!ErrorNode) { ErrorNode = Ctx.generateNonFatalErrorNode(State, &Tag); + if (!ErrorNode) + break; + State = ErrorNode->getState(); } // A wait has no matching nonblocking call. @@ -115,6 +121,9 @@ if (!ErrorNode) { ErrorNode = Ctx.generateNonFatalErrorNode(State, &Tag); + if (!ErrorNode) + break; + State = ErrorNode->getState(); } BReporter.reportMissingWait(Req.second, Req.first, ErrorNode, diff --git a/clang/test/Analysis/mpichecker.cpp b/clang/test/Analysis/mpichecker.cpp --- a/clang/test/Analysis/mpichecker.cpp +++ b/clang/test/Analysis/mpichecker.cpp @@ -389,3 +389,13 @@ void callNonblockingExtern(MPI_Request *req); callNonblockingExtern(&req); } + +bool contains(); +void gh64647() { + if (contains()) { + MPI_Request request_item; + MPI_Wait(&request_item, MPI_STATUS_IGNORE); + // expected-warning@-1 {{Request 'request_item' has no matching nonblocking call.}} + } + gh64647(); +}