diff options
| author | Pavel Labath <labath@google.com> | 2013-06-06 12:35:43 +0000 |
|---|---|---|
| committer | Pavel Labath <labath@google.com> | 2013-06-06 12:35:43 +0000 |
| commit | c3282c0b3c5f75eae1524a290dd2c0cee629b311 (patch) | |
| tree | 90d2bcb97f0da86e66394744484164d97e601893 /clang/tools | |
| parent | dee20c105b392d207d02871994f9fafd72fdf91b (diff) | |
| download | bcm5719-llvm-c3282c0b3c5f75eae1524a290dd2c0cee629b311.tar.gz bcm5719-llvm-c3282c0b3c5f75eae1524a290dd2c0cee629b311.zip | |
Add support for static analysis to clang-check
Summary:
This adds a command line argument '-analyze' to clang-check which runs the
clang static analyzer on the source files.
Reviewers: klimek
CC: cfe-commits, revane
Differential Revision: http://llvm-reviews.chandlerc.com/D926
llvm-svn: 183399
Diffstat (limited to 'clang/tools')
| -rw-r--r-- | clang/tools/clang-check/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | clang/tools/clang-check/ClangCheck.cpp | 44 |
2 files changed, 37 insertions, 8 deletions
diff --git a/clang/tools/clang-check/CMakeLists.txt b/clang/tools/clang-check/CMakeLists.txt index e8d0d0a18ab..2070de37fcf 100644 --- a/clang/tools/clang-check/CMakeLists.txt +++ b/clang/tools/clang-check/CMakeLists.txt @@ -14,6 +14,7 @@ target_link_libraries(clang-check clangTooling clangBasic clangRewriteFrontend + clangStaticAnalyzerFrontend ) install(TARGETS clang-check diff --git a/clang/tools/clang-check/ClangCheck.cpp b/clang/tools/clang-check/ClangCheck.cpp index 05783620ca3..bc01874bcf6 100644 --- a/clang/tools/clang-check/ClangCheck.cpp +++ b/clang/tools/clang-check/ClangCheck.cpp @@ -21,6 +21,7 @@ #include "clang/Driver/Options.h" #include "clang/Frontend/ASTConsumers.h" #include "clang/Frontend/CompilerInstance.h" +#include "clang/StaticAnalyzer/Frontend/FrontendActions.h" #include "clang/Rewrite/Frontend/FixItRewriter.h" #include "clang/Rewrite/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" @@ -62,6 +63,9 @@ static cl::opt<bool> ASTPrint( static cl::opt<std::string> ASTDumpFilter( "ast-dump-filter", cl::desc(Options->getOptionHelpText(options::OPT_ast_dump_filter))); +static cl::opt<bool> Analyze( + "analyze", + cl::desc(Options->getOptionHelpText(options::OPT_analyze))); static cl::opt<bool> Fixit( "fixit", @@ -136,6 +140,10 @@ public: : Extra(Extra), Pos(Pos) { } + InsertAdjuster(const char *Extra, Position Pos) + : Extra(1, std::string(Extra)), Pos(Pos) { + } + virtual CommandLineArguments Adjust(const CommandLineArguments &Args) LLVM_OVERRIDE { CommandLineArguments Return(Args); @@ -182,13 +190,33 @@ int main(int argc, const char **argv) { ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); - if (ArgsAfter.size() > 0) - Tool.appendArgumentsAdjuster(new InsertAdjuster(ArgsAfter, InsertAdjuster::END)); - if (ArgsBefore.size() > 0) - Tool.appendArgumentsAdjuster(new InsertAdjuster(ArgsBefore, InsertAdjuster::BEGIN)); + // Clear adjusters because -fsyntax-only is inserted by the default chain. + Tool.clearArgumentsAdjusters(); + Tool.appendArgumentsAdjuster(new ClangStripOutputAdjuster()); + if (ArgsAfter.size() > 0) { + Tool.appendArgumentsAdjuster(new InsertAdjuster(ArgsAfter, + InsertAdjuster::END)); + } + if (ArgsBefore.size() > 0) { + Tool.appendArgumentsAdjuster(new InsertAdjuster(ArgsBefore, + InsertAdjuster::BEGIN)); + } + + // Running the analyzer requires --analyze. Other modes can work with the + // -fsyntax-only option. + Tool.appendArgumentsAdjuster(new InsertAdjuster( + Analyze ? "--analyze" : "-fsyntax-only", InsertAdjuster::BEGIN)); + + clang_check::ClangCheckActionFactory CheckFactory; + FrontendActionFactory *FrontendFactory; + + // Choose the correct factory based on the selected mode. + if (Analyze) + FrontendFactory = newFrontendActionFactory<clang::ento::AnalysisAction>(); + else if (Fixit) + FrontendFactory = newFrontendActionFactory<FixItAction>(); + else + FrontendFactory = newFrontendActionFactory(&CheckFactory); - if (Fixit) - return Tool.run(newFrontendActionFactory<FixItAction>()); - clang_check::ClangCheckActionFactory Factory; - return Tool.run(newFrontendActionFactory(&Factory)); + return Tool.run(FrontendFactory); } |

