Author: Nathan James Date: 2020-05-31T17:41:29+01:00 New Revision: 5952125691571de9bd817551fb1baabe270e73f9
URL: https://github.com/llvm/llvm-project/commit/5952125691571de9bd817551fb1baabe270e73f9 DIFF: https://github.com/llvm/llvm-project/commit/5952125691571de9bd817551fb1baabe270e73f9.diff LOG: clang-tidy and clang-query wont crash with invalid command line options Motivated by [[ https://bugs.llvm.org/show_bug.cgi?id=46141 | clang-tidy crashed for unknown command line argument. ]] Reviewed By: aaron.ballman, thakis Differential Revision: https://reviews.llvm.org/D80879 Added: clang-tools-extra/test/clang-query/invalid-command-line.cpp clang-tools-extra/test/clang-tidy/infrastructure/invalid-command-line.cpp Modified: clang-tools-extra/clang-query/tool/ClangQuery.cpp clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-query/tool/ClangQuery.cpp b/clang-tools-extra/clang-query/tool/ClangQuery.cpp index 5cfa0acf9120..0c471def2e14 100644 --- a/clang-tools-extra/clang-query/tool/ClangQuery.cpp +++ b/clang-tools-extra/clang-query/tool/ClangQuery.cpp @@ -35,6 +35,7 @@ #include "llvm/Support/CommandLine.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Signals.h" +#include "llvm/Support/WithColor.h" #include <fstream> #include <string> @@ -86,7 +87,14 @@ bool runCommandsInFile(const char *ExeName, std::string const &FileName, int main(int argc, const char **argv) { llvm::sys::PrintStackTraceOnErrorSignal(argv[0]); - CommonOptionsParser OptionsParser(argc, argv, ClangQueryCategory); + llvm::Expected<CommonOptionsParser> OptionsParser = + CommonOptionsParser::create(argc, argv, ClangQueryCategory, + llvm::cl::OneOrMore); + + if (!OptionsParser) { + llvm::WithColor::error() << llvm::toString(OptionsParser.takeError()); + return 1; + } if (!Commands.empty() && !CommandFiles.empty()) { llvm::errs() << argv[0] << ": cannot specify both -c and -f\n"; @@ -99,8 +107,8 @@ int main(int argc, const char **argv) { return 1; } - ClangTool Tool(OptionsParser.getCompilations(), - OptionsParser.getSourcePathList()); + ClangTool Tool(OptionsParser->getCompilations(), + OptionsParser->getSourcePathList()); std::vector<std::unique_ptr<ASTUnit>> ASTs; int Status = Tool.buildASTs(ASTs); int ASTStatus = 0; diff --git a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp index 665d10026834..aca16b0d6d81 100644 --- a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -23,6 +23,7 @@ #include "llvm/Support/Process.h" #include "llvm/Support/Signals.h" #include "llvm/Support/TargetSelect.h" +#include "llvm/Support/WithColor.h" using namespace clang::ast_matchers; using namespace clang::driver; @@ -333,8 +334,14 @@ getVfsFromFile(const std::string &OverlayFile, int clangTidyMain(int argc, const char **argv) { llvm::InitLLVM X(argc, argv); - CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory, - cl::ZeroOrMore); + llvm::Expected<CommonOptionsParser> OptionsParser = + CommonOptionsParser::create(argc, argv, ClangTidyCategory, + cl::ZeroOrMore); + if (!OptionsParser) { + llvm::WithColor::error() << llvm::toString(OptionsParser.takeError()); + return 1; + } + llvm::IntrusiveRefCntPtr<vfs::OverlayFileSystem> BaseFS( new vfs::OverlayFileSystem(vfs::getRealFileSystem())); @@ -365,7 +372,7 @@ int clangTidyMain(int argc, const char **argv) { SmallString<256> ProfilePrefix = MakeAbsolute(StoreCheckProfile); StringRef FileName("dummy"); - auto PathList = OptionsParser.getSourcePathList(); + auto PathList = OptionsParser->getSourcePathList(); if (!PathList.empty()) { FileName = PathList.front(); } @@ -433,7 +440,7 @@ int clangTidyMain(int argc, const char **argv) { ClangTidyContext Context(std::move(OwningOptionsProvider), AllowEnablingAnalyzerAlphaCheckers); std::vector<ClangTidyError> Errors = - runClangTidy(Context, OptionsParser.getCompilations(), PathList, BaseFS, + runClangTidy(Context, OptionsParser->getCompilations(), PathList, BaseFS, EnableCheckProfile, ProfilePrefix); bool FoundErrors = llvm::find_if(Errors, [](const ClangTidyError &E) { return E.DiagLevel == ClangTidyError::Error; diff --git a/clang-tools-extra/test/clang-query/invalid-command-line.cpp b/clang-tools-extra/test/clang-query/invalid-command-line.cpp new file mode 100644 index 000000000000..901aad8c1f23 --- /dev/null +++ b/clang-tools-extra/test/clang-query/invalid-command-line.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-query --invalid-arg 2>&1 | FileCheck %s + +// CHECK: error: [CommonOptionsParser]: clang-query{{(\.exe)?}}: Unknown command line argument '--invalid-arg'. Try: 'clang-query{{(\.exe)?}} --help' +// CHECK-NEXT: clang-query{{(\.exe)?}}: Did you mean '--extra-arg'? diff --git a/clang-tools-extra/test/clang-tidy/infrastructure/invalid-command-line.cpp b/clang-tools-extra/test/clang-tidy/infrastructure/invalid-command-line.cpp new file mode 100644 index 000000000000..be84a0881895 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/infrastructure/invalid-command-line.cpp @@ -0,0 +1,4 @@ +// RUN: not clang-tidy --invalid-arg 2>&1 | FileCheck %s + +// CHECK: error: [CommonOptionsParser]: clang-tidy{{(\.exe)?}}: Unknown command line argument '--invalid-arg'. Try: 'clang-tidy{{(\.exe)?}} --help' +// CHECK-NEXT: clang-tidy{{(\.exe)?}}: Did you mean '--extra-arg'? _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits