From: Nathan James Date: Sun, 31 May 2020 16:41:29 +0000 (+0100) Subject: clang-tidy and clang-query wont crash with invalid command line options X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5952125691571de9bd817551fb1baabe270e73f9;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/clang-tools-extra/clang-query/tool/ClangQuery.cpp b/clang-tools-extra/clang-query/tool/ClangQuery.cpp index 5cfa0ac..0c471de 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 #include @@ -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 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> 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 665d100..aca16b0 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 OptionsParser = + CommonOptionsParser::create(argc, argv, ClangTidyCategory, + cl::ZeroOrMore); + if (!OptionsParser) { + llvm::WithColor::error() << llvm::toString(OptionsParser.takeError()); + return 1; + } + llvm::IntrusiveRefCntPtr 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 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 0000000..901aad8 --- /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 0000000..be84a08 --- /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'?