[PATCH] D58818: [clang-tidy] added cppcoreguidelines-use-raii-locks check

Jonas Toth via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Mar 1 10:22:30 PST 2019


JonasToth added inline comments.


================
Comment at: clang-tidy/cppcoreguidelines/UseRaiiLocksCheck.cpp:35
+void UseRaiiLocksCheck::registerMatchers(MatchFinder *Finder) {
+  // lock_guards require c++11 or later
+  if (!getLangOpts().CPlusPlus11)
----------------
If we allow boost, pre c++11 is ok as well.
In general, plz use proper grammar, punctuation and full sentences in comments.


================
Comment at: clang-tidy/cppcoreguidelines/UseRaiiLocksCheck.cpp:41
+      hasDeclaration(cxxRecordDecl(hasAnyListedName(LockableTypes))))));
+  // Match expressions of type mutex or mutex pointer
+  const auto MutexExpr =
----------------
please add proper punctutation in comments. we aim for correct text you can read and understand, with proper spelling and grammar.


================
Comment at: clang-tidy/cppcoreguidelines/UseRaiiLocksCheck.cpp:65
+
+  const auto LockCallExpr = Result.Nodes.getNodeAs<CXXMemberCallExpr>("lock");
+  const auto UnlockCallExpr =
----------------
please add the `*` for pointers to emphasize the difference between values and pointers.
In general we do not add `const` to values (as i believe is done in later lines), but only for pointers and references.


================
Comment at: clang-tidy/cppcoreguidelines/UseRaiiLocksCheck.cpp:69
+
+  const auto LockObjectName = Lexer::getSourceText(
+      CharSourceRange::getTokenRange(
----------------
Please don't retrieve the name like this. Too error prone and compilatcated.

You can compare use `DeclRefExpr` (https://clang.llvm.org/doxygen/classclang_1_1DeclRefExpr.html) for your `MutexExpr` instead.
>From there you go to the `Decl` and compare on pointer equality.


================
Comment at: clang-tidy/cppcoreguidelines/UseRaiiLocksCheck.h:28
+            "LockableTypes",
+            "::std::mutex;::std::recursive_mutex;::std::timed_mutex;::std::"
+            "recursive_timed_mutex;::std::unique_lock")) {}
----------------
It might be a good idea to add the `boost` types as well? I believe they are interface-compatible, given the std version is derived from them.


================
Comment at: test/clang-tidy/cppcoreguidelines-use-raii-locks.cpp:4
+// Mock implementation of std::mutex
+namespace std {
+struct mutex {
----------------
Please add more tests

What happens for this?
```
void foo() {
  std::mutex m;
  m.lock();
  m.unlock();
  m.lock();
  m.unlock();
  m.try_lock();
  m.lock();
  m.unlock();
}
```

- Please add tests for templates, where the lock-type is a template parameter
- please add tests where the locking happens within macros
- please add tests for usage within loops
- where cases like `std::mutex m1; std::mutex &m2 = m1; // usage`. This should not be diagnosed, right?


Repository:
  rCTE Clang Tools Extra

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D58818/new/

https://reviews.llvm.org/D58818





More information about the cfe-commits mailing list