[PATCH] D124447: [clang-tidy] Add infrastructure support for running on project-level information
Aaron Ballman via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 24 10:47:03 PDT 2022
aaron.ballman added a comment.
In general, I think this is looking pretty close to good. Whether clang-tidy should get this functionality in this form or not is a bit less clear to me. *I* think it's helpful functionality and the current approach is reasonable, but I think it might be worthwhile to have a community RFC to see if others agree. CC @alexfh in case he wants to make a code owner decision instead.
================
Comment at: clang-tools-extra/clang-tidy/ClangTidy.cpp:321-324
+ if (MultipassPhase == MultipassProjectPhase::Collect)
+ // Allow the checks to write their data at the end of execution.
+ for (auto &Check : Checks)
+ Check->runPostCollect();
----------------
I'd add the braces for readability despite them not being strictly required.
================
Comment at: clang-tools-extra/clang-tidy/ClangTidy.cpp:347-348
+ ClangTidyCheckFactories &CheckFactories) {
+ CheckVec Checks = CheckFactories.createChecks(&Context);
+ return Checks;
+}
----------------
================
Comment at: clang-tools-extra/clang-tidy/ClangTidyCheck.cpp:54
+ case MultipassProjectPhase::Compact:
+ llvm_unreachable("AST Matchers should not have run in compact mode.");
+ }
----------------
I'm on the fence about whether this should be an unreachable or an assert. This seems like it's an assertion situation (if you reach that case, the programmer made a mistake; it's not that you can never reach this case).
================
Comment at: clang-tools-extra/clang-tidy/ClangTidyCheck.h:118-119
+
+ /// Checks that performed ``collect`` should write their data to the output to
+ /// the file in here.
+ virtual void postCollect(StringRef OutFile) {}
----------------
================
Comment at: clang-tools-extra/clang-tidy/ClangTidyCheck.h:122
+
+ /// Execute the ``postCollect()`` function to the right, automatically
+ /// generated filename.
----------------
I'm not certain what "to the right" means in this context, so some extra clarification here would be reasonable. I think it's saying that it's a post order traversal?
================
Comment at: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp:242-243
+ MultipassProjectPhase Phase = getGlobalOptions().MultipassPhase;
+ if (Phase == MultipassProjectPhase::Collect)
+ llvm_unreachable("Invalid phase 'Collect' for accessing compacted data");
+
----------------
I think this would be expressed better via an `assert`.
================
Comment at: clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp:246
+ auto InsertResult = CompactedDataPaths.try_emplace(CheckName, "");
+ std::string &FilePath = InsertResult.first->second;
+ if (!InsertResult.second)
----------------
Why is this a reference?
================
Comment at: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp:552-553
+ }
+ if (!llvm::sys::fs::is_directory(MultipassDir))
+ llvm::sys::fs::create_directory(MultipassDir);
+ }
----------------
This looks like a TOCTOU issue; `create_directory()` takes an argument for whether you should ignore existing or not, that should suffice here, right?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124447/new/
https://reviews.llvm.org/D124447
More information about the cfe-commits
mailing list