[PATCH] D93940: [clang-tidy] Add a check for blocking types and functions.
Nathan James via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Dec 30 05:14:22 PST 2020
njames93 added a comment.
Few stylistic nits, Also Theres lots of cases where single stmt if statements have braces, typically we elide those braces.
Is it worth flagging methods with Thread safety analysis <https://clang.llvm.org/docs/ThreadSafetyAnalysis.html> attributes.
These are only used in clang, but if a project annotates their methods with these, it would be nice to autodetect these attributes, though I can see this being a big job and likely better for a follow up.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:16-21
+static const auto kName = "name";
+static const auto kType = "type";
+static const auto kFunction = "function";
+static const auto kMethod = "method";
+static const auto kAtomic = "atomic";
+static const auto kLockfree = "lockfree";
----------------
These go against llvm naming convention of Variables being CamelCase.
Also don't use auto when the type is spelled in the initialization.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:23
+
+static std::vector<clang::StringRef>
+toVector(const std::vector<clang::StringRef> Base, clang::StringRef Extra) {
----------------
`clang::StringRef` is a code smell imo, use `llvm::StringRef` or move this code into the clang namespace and drop the qualifier.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:24
+static std::vector<clang::StringRef>
+toVector(const std::vector<clang::StringRef> Base, clang::StringRef Extra) {
+ llvm::SmallVector<clang::StringRef, 4> Tmp{Base.begin(), Base.end()};
----------------
This could take an ArrayRef instead of const vector ref.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:33
+
+static const std::vector<clang::StringRef> LockableBase = {
+ /* C++ std */
----------------
This and all examples below don't belong on the heap, Just use an array.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:35
+ /* C++ std */
+ "std::mutex", //
+ "std::timed_mutex", //
----------------
Is it wise to fully qualify these?
`::std::mutex`
Also whats with the comments at the end of each line, they don't seem to add anything.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:222
+ // std::mutex
+ auto Lockable = toVector(LockableBase, StringRef(LockableExtra));
+ Finder->addMatcher(
----------------
No need to case to `StringRef`, its implicit.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:292-293
+
+ const auto *D = Result.Nodes.getNodeAs<ValueDecl>(kType);
+ if (D) {
+ diag(D->getBeginLoc(), "type " + D->getType().getAsString() +
----------------
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:299-300
+
+ const auto *CE = Result.Nodes.getNodeAs<CXXMemberCallExpr>(kMethod);
+ if (CE) {
+ if (Name) {
----------------
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:302-304
+ diag(CE->getBeginLoc(), "method " + Name->getNameAsString() +
+ " may sleep and is not coroutine-safe")
+ << SourceRange(CE->getBeginLoc(), CE->getEndLoc());
----------------
Diagnostics support "%0" style formatting.
That formatting handles NamedDecls.
Stmt has a SourceRange that does the same job as (getBeginLoc(), getEndLoc()]
This can be applied in other places.
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:308-309
+
+ const auto *E = Result.Nodes.getNodeAs<CallExpr>(kFunction);
+ if (E) {
+ if (Name) {
----------------
================
Comment at: clang-tools-extra/clang-tidy/concurrency/AsyncBlockingCheck.cpp:320
+ const auto *Lockfree = Result.Nodes.getNodeAs<VarDecl>(kLockfree);
+ if (Lockfree) {
+ const auto *EV = Lockfree->ensureEvaluatedStmt();
----------------
>From the code, Lockfree can't be null if Atomic binds, maybe make this an assert
================
Comment at: clang-tools-extra/test/clang-tidy/checkers/concurrency-async-blocking.cpp:450
+
+// TODO: remove CHECKT-MESSAGES
----------------
Whats this for?
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D93940/new/
https://reviews.llvm.org/D93940
More information about the cfe-commits
mailing list