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