14967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===-- MPIBugReporter.h - bug reporter -----------------------*- C++ -*-===// 24967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 34967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// The LLVM Compiler Infrastructure 44967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 54967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 64967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// License. See LICENSE.TXT for details. 74967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar// 84967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===// 94967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// \file 114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// This file defines prefabricated reports which are emitted in 124967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// case of MPI related bugs, detected by path-sensitive analysis. 134967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar/// 144967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar//===----------------------------------------------------------------------===// 154967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 164967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#ifndef LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPIBUGREPORTER_H 174967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#define LLVM_CLANG_LIB_STATICANALYZER_CHECKERS_MPICHECKER_MPIBUGREPORTER_H 184967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 194967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "MPITypes.h" 204967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h" 214967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 224967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace clang { 234967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace ento { 244967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarnamespace mpi { 254967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 264967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarclass MPIBugReporter { 274967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarpublic: 284967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MPIBugReporter(const CheckerBase &CB) { 294967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar UnmatchedWaitBugType.reset(new BugType(&CB, "Unmatched wait", MPIError)); 304967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar DoubleNonblockingBugType.reset( 314967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar new BugType(&CB, "Double nonblocking", MPIError)); 324967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar MissingWaitBugType.reset(new BugType(&CB, "Missing wait", MPIError)); 334967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 344967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 354967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Report duplicate request use by nonblocking calls without intermediate 364967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// wait. 374967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 384967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param MPICallEvent MPI call that caused the double nonblocking 394967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param Req request that was used by two nonblocking calls in sequence 404967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param RequestRegion memory region of the request 414967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param ExplNode node in the graph the bug appeared at 424967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param BReporter bug reporter for current context 434967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void reportDoubleNonblocking(const CallEvent &MPICallEvent, 444967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const Request &Req, 454967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const MemRegion *const RequestRegion, 464967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ExplodedNode *const ExplNode, 474967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BugReporter &BReporter) const; 484967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 494967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Report a missing wait for a nonblocking call. A missing wait report 504967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// is emitted if a nonblocking call is not matched in the scope of a 514967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// function. 524967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 534967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param Req request that is not matched by a wait 544967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param RequestRegion memory region of the request 554967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param ExplNode node in the graph the bug appeared at 564967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param BReporter bug reporter for current context 574967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void reportMissingWait(const Request &Req, 584967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const MemRegion *const RequestRegion, 594967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ExplodedNode *const ExplNode, 604967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BugReporter &BReporter) const; 614967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 624967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Report a wait on a request that has not been used at all before. 634967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// 644967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param CE wait call that uses the request 654967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param RequestRegion memory region of the request 664967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param ExplNode node in the graph the bug appeared at 674967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// \param BReporter bug reporter for current context 684967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void reportUnmatchedWait(const CallEvent &CE, 694967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const MemRegion *const RequestRegion, 704967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ExplodedNode *const ExplNode, 714967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BugReporter &BReporter) const; 724967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 734967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainarprivate: 744967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const std::string MPIError = "MPI Error"; 754967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 764967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar // path-sensitive bug types 774967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::unique_ptr<BugType> UnmatchedWaitBugType; 784967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::unique_ptr<BugType> MissingWaitBugType; 794967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::unique_ptr<BugType> DoubleNonblockingBugType; 804967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 814967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// Bug visitor class to find the node where the request region was previously 824967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar /// used in order to include it into the BugReport path. 834967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar class RequestNodeVisitor : public BugReporterVisitorImpl<RequestNodeVisitor> { 844967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar public: 854967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar RequestNodeVisitor(const MemRegion *const MemoryRegion, 864967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const std::string &ErrText) 874967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar : RequestRegion(MemoryRegion), ErrorText(ErrText) {} 884967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 894967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar void Profile(llvm::FoldingSetNodeID &ID) const override { 904967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar static int X = 0; 914967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ID.AddPointer(&X); 924967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar ID.AddPointer(RequestRegion); 934967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar } 944967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 954967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar PathDiagnosticPiece *VisitNode(const ExplodedNode *N, 964967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const ExplodedNode *PrevN, 974967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BugReporterContext &BRC, 984967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar BugReport &BR) override; 994967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1004967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar private: 1014967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar const MemRegion *const RequestRegion; 1024967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar bool IsNodeFound = false; 1034967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar std::string ErrorText; 1044967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar }; 1054967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar}; 1064967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1074967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end of namespace: mpi 1084967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end of namespace: ento 1094967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar} // end of namespace: clang 1104967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar 1114967a710c84587c654b56c828382219c3937dacbPirama Arumuga Nainar#endif 112