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.
llvm-svn: 87053
This commit is contained in:
parent
1e886ebe8c
commit
aedb7434c8
|
|
@ -50,6 +50,7 @@ void CheckObjCInstMethSignature(const ObjCImplementationDecl *ID,
|
||||||
void CheckObjCUnusedIvar(const ObjCImplementationDecl *D, BugReporter& BR);
|
void CheckObjCUnusedIvar(const ObjCImplementationDecl *D, BugReporter& BR);
|
||||||
|
|
||||||
void RegisterAppleChecks(GRExprEngine& Eng, const Decl &D);
|
void RegisterAppleChecks(GRExprEngine& Eng, const Decl &D);
|
||||||
|
void RegisterExperimentalChecks(GRExprEngine &Eng);
|
||||||
|
|
||||||
void CheckSecuritySyntaxOnly(const Decl *D, BugReporter &BR);
|
void CheckSecuritySyntaxOnly(const Decl *D, BugReporter &BR);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,7 @@ public:
|
||||||
unsigned TrimGraph : 1;
|
unsigned TrimGraph : 1;
|
||||||
unsigned VisualizeEGDot : 1;
|
unsigned VisualizeEGDot : 1;
|
||||||
unsigned VisualizeEGUbi : 1;
|
unsigned VisualizeEGUbi : 1;
|
||||||
|
unsigned EnableExperimentalChecks : 1;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
AnalyzerOptions() {
|
AnalyzerOptions() {
|
||||||
|
|
@ -77,6 +78,7 @@ public:
|
||||||
TrimGraph = 0;
|
TrimGraph = 0;
|
||||||
VisualizeEGDot = 0;
|
VisualizeEGDot = 0;
|
||||||
VisualizeEGUbi = 0;
|
VisualizeEGUbi = 0;
|
||||||
|
EnableExperimentalChecks = 0;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ add_clang_library(clangAnalysis
|
||||||
GRBlockCounter.cpp
|
GRBlockCounter.cpp
|
||||||
GRCoreEngine.cpp
|
GRCoreEngine.cpp
|
||||||
GRExprEngine.cpp
|
GRExprEngine.cpp
|
||||||
|
GRExprEngineExperimentalChecks.cpp
|
||||||
GRExprEngineInternalChecks.cpp
|
GRExprEngineInternalChecks.cpp
|
||||||
GRState.cpp
|
GRState.cpp
|
||||||
LiveVariables.cpp
|
LiveVariables.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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -333,6 +333,8 @@ static void ActionGRExprEngine(AnalysisConsumer &C, AnalysisManager& mgr, Decl *
|
||||||
// automatically register.
|
// automatically register.
|
||||||
RegisterAppleChecks(Eng, *D);
|
RegisterAppleChecks(Eng, *D);
|
||||||
|
|
||||||
|
if (C.Opts.EnableExperimentalChecks)
|
||||||
|
RegisterExperimentalChecks(Eng);
|
||||||
|
|
||||||
// Set the graph auditor.
|
// Set the graph auditor.
|
||||||
llvm::OwningPtr<ExplodedNode::Auditor> Auditor;
|
llvm::OwningPtr<ExplodedNode::Auditor> Auditor;
|
||||||
|
|
|
||||||
|
|
@ -81,7 +81,11 @@ AnalyzeAll("analyzer-opt-analyze-headers",
|
||||||
|
|
||||||
static llvm::cl::opt<bool>
|
static llvm::cl::opt<bool>
|
||||||
AnalyzerDisplayProgress("analyzer-display-progress",
|
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>
|
static llvm::cl::opt<std::string>
|
||||||
AnalyzeSpecificFunction("analyze-function",
|
AnalyzeSpecificFunction("analyze-function",
|
||||||
|
|
@ -91,13 +95,13 @@ static llvm::cl::opt<bool>
|
||||||
EagerlyAssume("analyzer-eagerly-assume",
|
EagerlyAssume("analyzer-eagerly-assume",
|
||||||
llvm::cl::init(false),
|
llvm::cl::init(false),
|
||||||
llvm::cl::desc("Eagerly assume the truth/falseness of some "
|
llvm::cl::desc("Eagerly assume the truth/falseness of some "
|
||||||
"symbolic constraints."));
|
"symbolic constraints"));
|
||||||
|
|
||||||
static llvm::cl::opt<bool>
|
static llvm::cl::opt<bool>
|
||||||
PurgeDead("analyzer-purge-dead",
|
PurgeDead("analyzer-purge-dead",
|
||||||
llvm::cl::init(true),
|
llvm::cl::init(true),
|
||||||
llvm::cl::desc("Remove dead symbols, bindings, and constraints before"
|
llvm::cl::desc("Remove dead symbols, bindings, and constraints before"
|
||||||
" processing a statement."));
|
" processing a statement"));
|
||||||
|
|
||||||
static llvm::cl::opt<bool>
|
static llvm::cl::opt<bool>
|
||||||
TrimGraph("trim-egraph",
|
TrimGraph("trim-egraph",
|
||||||
|
|
@ -126,6 +130,7 @@ void clang::InitializeAnalyzerOptions(AnalyzerOptions &Opts) {
|
||||||
Opts.PurgeDead = PurgeDead;
|
Opts.PurgeDead = PurgeDead;
|
||||||
Opts.EagerlyAssume = EagerlyAssume;
|
Opts.EagerlyAssume = EagerlyAssume;
|
||||||
Opts.AnalyzeSpecificFunction = AnalyzeSpecificFunction;
|
Opts.AnalyzeSpecificFunction = AnalyzeSpecificFunction;
|
||||||
|
Opts.EnableExperimentalChecks = AnalyzerExperimentalChecks;
|
||||||
Opts.TrimGraph = TrimGraph;
|
Opts.TrimGraph = TrimGraph;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue