From eb94113be0ee5f4d38408b413d92464a0bc16b55 Mon Sep 17 00:00:00 2001 From: Ted Kremenek <kremenek@apple.com> Date: Fri, 13 Nov 2009 01:15:47 +0000 Subject: [PATCH] Add clang-cc option "-analyzer-experimental-checks" to enable experimental path-sensitive checks. The idea is to separate "barely working" or "skunkworks" checks from ones that should always run. Later we need more fine-grain checker control. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@87053 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Analysis/LocalCheckers.h | 1 + include/clang/Frontend/AnalysisConsumer.h | 2 ++ lib/Analysis/CMakeLists.txt | 1 + .../GRExprEngineExperimentalChecks.cpp | 23 +++++++++++++++++++ lib/Frontend/AnalysisConsumer.cpp | 4 +++- tools/clang-cc/Options.cpp | 13 +++++++---- 6 files changed, 39 insertions(+), 5 deletions(-) create mode 100644 lib/Analysis/GRExprEngineExperimentalChecks.cpp diff --git a/include/clang/Analysis/LocalCheckers.h b/include/clang/Analysis/LocalCheckers.h index cd2d6b3ec70..5182d63b0dd 100644 --- a/include/clang/Analysis/LocalCheckers.h +++ b/include/clang/Analysis/LocalCheckers.h @@ -50,6 +50,7 @@ void CheckObjCInstMethSignature(const ObjCImplementationDecl *ID, void CheckObjCUnusedIvar(const ObjCImplementationDecl *D, BugReporter& BR); void RegisterAppleChecks(GRExprEngine& Eng, const Decl &D); +void RegisterExperimentalChecks(GRExprEngine &Eng); void CheckSecuritySyntaxOnly(const Decl *D, BugReporter &BR); diff --git a/include/clang/Frontend/AnalysisConsumer.h b/include/clang/Frontend/AnalysisConsumer.h index d8fe9f33a9f..fb0baff0052 100644 --- a/include/clang/Frontend/AnalysisConsumer.h +++ b/include/clang/Frontend/AnalysisConsumer.h @@ -67,6 +67,7 @@ public: unsigned TrimGraph : 1; unsigned VisualizeEGDot : 1; unsigned VisualizeEGUbi : 1; + unsigned EnableExperimentalChecks : 1; public: AnalyzerOptions() { @@ -77,6 +78,7 @@ public: TrimGraph = 0; VisualizeEGDot = 0; VisualizeEGUbi = 0; + EnableExperimentalChecks = 0; } }; diff --git a/lib/Analysis/CMakeLists.txt b/lib/Analysis/CMakeLists.txt index 3638b831a7f..8e8c1e7b25e 100644 --- a/lib/Analysis/CMakeLists.txt +++ b/lib/Analysis/CMakeLists.txt @@ -30,6 +30,7 @@ add_clang_library(clangAnalysis GRBlockCounter.cpp GRCoreEngine.cpp GRExprEngine.cpp + GRExprEngineExperimentalChecks.cpp GRExprEngineInternalChecks.cpp GRState.cpp LiveVariables.cpp diff --git a/lib/Analysis/GRExprEngineExperimentalChecks.cpp b/lib/Analysis/GRExprEngineExperimentalChecks.cpp new file mode 100644 index 00000000000..e50dbeba688 --- /dev/null +++ b/lib/Analysis/GRExprEngineExperimentalChecks.cpp @@ -0,0 +1,23 @@ +//=-- GRExprEngineExperimentalChecks.h ------------------------------*- C++ -*-= +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines functions to instantiate and register experimental +// checks in GRExprEngine. +// +//===----------------------------------------------------------------------===// + +#include "GRExprEngineExperimentalChecks.h" +#include "clang/Analysis/LocalCheckers.h" + +using namespace clang; + +void clang::RegisterExperimentalChecks(GRExprEngine &Eng) { + RegisterPthreadLockChecker(Eng); +} + diff --git a/lib/Frontend/AnalysisConsumer.cpp b/lib/Frontend/AnalysisConsumer.cpp index d51730c20f2..e8bd920d412 100644 --- a/lib/Frontend/AnalysisConsumer.cpp +++ b/lib/Frontend/AnalysisConsumer.cpp @@ -332,7 +332,9 @@ static void ActionGRExprEngine(AnalysisConsumer &C, AnalysisManager& mgr, Decl * Eng.RegisterInternalChecks(); // FIXME: Internal checks should just // automatically register. RegisterAppleChecks(Eng, *D); - + + if (C.Opts.EnableExperimentalChecks) + RegisterExperimentalChecks(Eng); // Set the graph auditor. llvm::OwningPtr<ExplodedNode::Auditor> Auditor; diff --git a/tools/clang-cc/Options.cpp b/tools/clang-cc/Options.cpp index 5d01e03a9ca..5b3800f3f20 100644 --- a/tools/clang-cc/Options.cpp +++ b/tools/clang-cc/Options.cpp @@ -78,11 +78,15 @@ static llvm::cl::opt<bool> AnalyzeAll("analyzer-opt-analyze-headers", llvm::cl::desc("Force the static analyzer to analyze " "functions defined in header files")); - + static llvm::cl::opt<bool> AnalyzerDisplayProgress("analyzer-display-progress", - llvm::cl::desc("Emit verbose output about the analyzer's progress.")); + llvm::cl::desc("Emit verbose output about the analyzer's progress")); +static llvm::cl::opt<bool> +AnalyzerExperimentalChecks("analyzer-experimental-checks", + llvm::cl::desc("Use experimental path-sensitive checks")); + static llvm::cl::opt<std::string> AnalyzeSpecificFunction("analyze-function", llvm::cl::desc("Run analysis on specific function")); @@ -91,13 +95,13 @@ static llvm::cl::opt<bool> EagerlyAssume("analyzer-eagerly-assume", llvm::cl::init(false), llvm::cl::desc("Eagerly assume the truth/falseness of some " - "symbolic constraints.")); + "symbolic constraints")); static llvm::cl::opt<bool> PurgeDead("analyzer-purge-dead", llvm::cl::init(true), llvm::cl::desc("Remove dead symbols, bindings, and constraints before" - " processing a statement.")); + " processing a statement")); static llvm::cl::opt<bool> TrimGraph("trim-egraph", @@ -126,6 +130,7 @@ void clang::InitializeAnalyzerOptions(AnalyzerOptions &Opts) { Opts.PurgeDead = PurgeDead; Opts.EagerlyAssume = EagerlyAssume; Opts.AnalyzeSpecificFunction = AnalyzeSpecificFunction; + Opts.EnableExperimentalChecks = AnalyzerExperimentalChecks; Opts.TrimGraph = TrimGraph; } -- GitLab