summaryrefslogtreecommitdiffstats
path: root/clang/tools
diff options
context:
space:
mode:
authorPavel Labath <labath@google.com>2013-06-06 12:35:43 +0000
committerPavel Labath <labath@google.com>2013-06-06 12:35:43 +0000
commitc3282c0b3c5f75eae1524a290dd2c0cee629b311 (patch)
tree90d2bcb97f0da86e66394744484164d97e601893 /clang/tools
parentdee20c105b392d207d02871994f9fafd72fdf91b (diff)
downloadbcm5719-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.txt1
-rw-r--r--clang/tools/clang-check/ClangCheck.cpp44
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);
}
OpenPOWER on IntegriCloud