gribozavr added inline comments.

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/Checkers.td:524
@@ +523,3 @@
+def MPIChecker : Checker<"MPI-Checker">,
+  HelpText<"Checks MPI code written in C">,
+  DescFile<"MPIChecker.cpp">;
----------------
Does it only works with C code, or does it work with C++ code that uses C 
bindings for MPI?  I think it is safe to describe it as "Checks MPI code".

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:1
@@ +1,2 @@
+//===-- Container.hpp - convenience templates for containers ----*- C++ 
-*-===//
+//
----------------
The file should use the `.h` extension (here and everywhere else in the patch).

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:10-11
@@ +9,4 @@
+///
+/// \file
+/// This file defines convenience templates for C++ container class usage.
+///
----------------
This file re-invents a lot of APIs that are currently under review by the C++ 
committee under the Ranges effort.  I think most of the wrappers are more or 
less trivial and should use STL directly, or the wrappers should match exactly 
the currently proposed STL APIs.

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:15
@@ +14,3 @@
+
+#ifndef CONTAINER_HPP_XM1FDRVJ
+#define CONTAINER_HPP_XM1FDRVJ
----------------
Please look at other files in Clang and follow the same include guard style 
(here and everywhere else in the patch).

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:22
@@ +21,3 @@
+
+/// \brief Check if given element is contained.
+///
----------------
Please drop `\brief` everywhere.

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:24-25
@@ +23,4 @@
+///
+/// \param container
+/// \param elementToCheck
+///
----------------
If there is no description for the parameter, please drop `\param`.

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:27
@@ +26,3 @@
+///
+/// \returns true if element contained
+template <typename T, typename E>
----------------
This is the gist of the documentation.  I think the doc comment should be just 
one line, `/// Returns true if \p container contains \p element.`

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:29
@@ +28,3 @@
+template <typename T, typename E>
+bool isContained(const T &container, const E &elementToCheck) {
+  return std::find(container.begin(), container.end(), elementToCheck) !=
----------------
I'd prefer the parameter to be called just `Element`.  The function name should 
probably be just `contains`.

Also, please follow the LLVM naming style everywhere (variable names start with 
a capital letter).

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:39
@@ +38,3 @@
+///
+/// \returns true if element that matched predicate is contained
+template <typename T, typename P>
----------------
`/// Returns true if \p container contains an element for which \p predicate 
returns true.`


================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:46-50
@@ +45,7 @@
+
+/// \brief Deletes first appearance of given element.
+///
+/// \param container
+/// \param elementToErase
+template <typename T, typename E> void erase(T &container, E &elementToErase) {
+  auto it = std::find(container.begin(), container.end(), elementToErase);
----------------
Same comments as above apply to this function as well as the rest of the patch. 
 I wouldn't be duplicating them over and over again, please scan the whole 
patch.

================
Comment at: tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:67
@@ +66,3 @@
+
+/// \brief Deletes first appearance of given pointer.
+///
----------------
Why is this a separate overload?

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/Container.hpp:88-109
@@ +87,24 @@
+
+/// \brief Deletes element at given index.
+///
+/// \param container
+/// \param index
+template <typename T> void eraseIndex(T &container, size_t idx) {
+  container.erase(container.begin() + idx);
+}
+
+/// \brief Sort with default criterion.
+///
+/// \param container
+template <typename T> void sort(T &container) {
+  std::sort(container.begin(), container.end());
+}
+
+/// \brief Sort by given predicate.
+///
+/// \param container
+/// \param predicate
+template <typename T, typename P> void sortPred(T &container, P predicate) {
+  std::sort(container.begin(), container.end(), predicate);
+}
+
----------------
I question the value of such trivial wrappers.

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIBugReporter.hpp:22
@@ +21,3 @@
+
+namespace mpi {
+
----------------
The namespace should be nested under `clang`, we shouldn't be claiming the 
top-level `mpi` namespace.

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIBugReporter.hpp:45-48
@@ +44,6 @@
+  ///
+  /// \param call expression to report mismatch for
+  /// \param argument indices
+  /// \param buffer type
+  /// \param MPI type
+  void reportTypeMismatch(const clang::CallExpr *const,
----------------
The syntax of `\param` is: `\param <parameter name> <description>`, these lines 
are missing the parameter names.

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIBugReporter.hpp:49-51
@@ +48,5 @@
+  /// \param MPI type
+  void reportTypeMismatch(const clang::CallExpr *const,
+                          const std::pair<size_t, size_t> &, clang::QualType,
+                          std::string) const;
+
----------------
The forward declarations should include parameter names for documentation and 
readability purposes.

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPIBugReporter.hpp:104
@@ +103,3 @@
+
+  const clang::Decl *currentFunctionDecl_{nullptr};
+
----------------
Naming class members with a trailing underscore is not a part of LLVM style 
(here and everywhere else in the patch).  Please follow the LLVM coding 
guidelines: http://llvm.org/docs/CodingStandards.html

Also, I think using `= nullptr` is more readable in this case.

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPICheckerAST.cpp:22
@@ +21,3 @@
+
+void MPICheckerAST::initMPITypeContainer() {
+  mpiTypes_ = {"MPI_BYTE",
----------------
MPICH has its header files annotated for Clang for a few years already, I think 
we should be using the annotations instead of textually matching the constants. 
 Moreover, some users are using those annotations for their own datatypes.

================
Comment at: 
tools/clang/lib/StaticAnalyzer/Checkers/MPI-Checker/MPICheckerAST.hpp:101
@@ +100,3 @@
+  MPIFunctionClassifier funcClassifier_;
+  llvm::SmallVector<std::string, 32> mpiTypes_;
+  MPIBugReporter bugReporter_;
----------------
This should be a hashtable-based set, like `llvm::DenseSet`.  Scanning this 
vector over and over again is wasteful.

================
Comment at: tools/clang/test/Analysis/MPIChecker.c:1
@@ +1,2 @@
+// RUN: %clang_cc1 -I/usr/include/ -I/usr/local/include/ -analyze 
-analyzer-checker=mpi.MPI-Checker -verify %s
+
----------------
Please drop `-I/usr/...` flags here.

================
Comment at: tools/clang/test/Analysis/MPIChecker.c:3
@@ +2,3 @@
+
+#include <mpi.h>
+#include <complex.h>
----------------
We can not include `mpi.h` directly here, because we can not require all 
developers to have MPI installed.  We need to use a mock header that is checked 
into Clang's repository.

Even more, the implementation details of `mpi.h` are in fact implementation 
details.  We need to make sure that the checks work with MPICH-style and 
OpenMPI-style definitions.  Please take a look at the incomplete `mpi.h` mock 
that I have in `test/Sema/warn-type-safety-mpi-hdf5.c`.


http://reviews.llvm.org/D12761



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to