[PATCH] D35372: [clang-tidy] Refactor the code and add a close-on-exec check on memfd_create() in Android module.

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Aug 3 02:02:28 PDT 2017


hokein added a comment.

Sorry for the delay, and thanks for refining it.

In general, I'm fine with the current design, a few comments below.



================
Comment at: clang-tidy/android/CloexecCheck.cpp:62
+    const int ArgPos) {
+  const auto MatchedCall = Result.Nodes.getNodeAs<CallExpr>("func");
+  const auto FD = Result.Nodes.getNodeAs<FunctionDecl>("funcDecl");
----------------
Use `const auto*`, obviously indicates this is a pointer, the same to other places. 


================
Comment at: clang-tidy/android/CloexecCheck.cpp:94
+  StringRef SR = cast<StringLiteral>(Arg->IgnoreParenCasts())->getString();
+  return ("\"" + SR + Twine(Mode) + "\"").str();
+}
----------------
I think there will be a use-after-free issue here.

The method returns a StringRef (which doesn't own the "std::string"), the temporary `std::string` will be destructed after the method finished.


================
Comment at: clang-tidy/android/CloexecCheck.h:18
+
+/// The base class for all close-on-exec checks.
+class CloexecCheck : public ClangTidyCheck {
----------------
This base class will  be used in a bunch of cloase-on-exec checks.
It deserves a better and more detailed documentation (e.g. the intended usage).


================
Comment at: clang-tidy/android/CloexecCheck.h:26
+  template <typename... Types>
+  void doRegisterMatchers(ast_matchers::MatchFinder *Finder, Types... Params) {
+    auto FuncDecl = std::bind(ast_matchers::functionDecl,
----------------
I think we can drop the `do` for most methods, how about 

`doRegisterMatchers` => `registerMatchers`
`doMacroFlagInsertion` => `insertMacroFlag`
`doFuncReplacement` => `replaceFunc`
`doStringFlagInsertion` => `insertStringFlag`?


================
Comment at: clang-tidy/android/CloexecCheck.h:30
+    Finder->addMatcher(ast_matchers::callExpr(
+                           ast_matchers::callee(FuncDecl().bind("funcDecl")))
+                           .bind("func"),
----------------
Instead of using the magic string `funDecl` anywhere, I would define a static const member for it. The same to `func`.


================
Comment at: clang-tidy/android/CloexecCheck.h:35
+
+  // This issue has three types.
+  // Type1 is to insert the necessary macro flag in the flag argument.
----------------
It is unclear to me what the "issue" means here? I assume there are three types of fixes?


================
Comment at: clang-tidy/android/CloexecCheck.h:36
+  // This issue has three types.
+  // Type1 is to insert the necessary macro flag in the flag argument.
+  void
----------------
Deserve a document on the behavior of the method, would be better to give an example. The same below.

Is `Flag` required to be a macro flag? looks like it could be any string.


================
Comment at: clang-tidy/android/CloexecCheck.h:53
+  // Helper function to get the spelling of a particular argument.
+  StringRef getArgSpelling(const ast_matchers::MatchFinder::MatchResult &Result,
+                           int n);
----------------
Maybe getSpellingArg which sounds more natural?


================
Comment at: clang-tidy/android/CloexecCheck.h:54
+  StringRef getArgSpelling(const ast_matchers::MatchFinder::MatchResult &Result,
+                           int n);
+
----------------
s/n/N


================
Comment at: clang-tidy/android/CloexecCheck.h:75
+  inline ast_matchers::internal::Matcher<FunctionDecl>
+  hasSockAddrPointerTypeParameter(int n) {
+    return ast_matchers::hasParameter(
----------------
should we put this method and below in the base class? They seem to be check-specific, I think? 


https://reviews.llvm.org/D35372





More information about the cfe-commits mailing list