зеркало из https://github.com/microsoft/clang-1.git
Break off declaration of Analysis enum into Analyses.def. The driver options in
clang.cpp now #include these definitions to create the command line options, and AnalysisConsumer #includes this file to generate the switch statement to create actions. Renamed -check-objc-methodsigs to -warn-objc-methodsigs. The "missing -dealloc" check is now optional: -warn-objc-missing-dealloc git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@53575 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
8f2698621f
Коммит
fb9a48cf5e
|
@ -0,0 +1,41 @@
|
|||
//===-- Analyses.def - Metadata about Static Analyses -----------*- 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 the set of static analyses used by AnalysisConsumer.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
ANALYSIS(CFGDump, "cfg-dump",
|
||||
"Display Control-Flow Graphs")
|
||||
|
||||
ANALYSIS(CFGView, "cfg-view",
|
||||
"View Control-Flow Graphs using GraphViz")
|
||||
|
||||
ANALYSIS(DisplayLiveVariables, "dump-live-variables",
|
||||
"Print results of live variable analysis")
|
||||
|
||||
ANALYSIS(WarnDeadStores, "warn-dead-stores",
|
||||
"Warn about stores to dead variables")
|
||||
|
||||
ANALYSIS(WarnUninitVals, "warn-uninit-values",
|
||||
"Warn about uses of uninitialized variables")
|
||||
|
||||
ANALYSIS(WarnObjCMethSigs, "warn-objc-methodsigs",
|
||||
"Warn about Objective-C method signatures with type incompatibilities")
|
||||
|
||||
ANALYSIS(WarnObjCDealloc, "warn-objc-missing-dealloc",
|
||||
"Warn about Objective-C classes that lack a correct implementation of -dealloc")
|
||||
|
||||
ANALYSIS(CheckerSimple, "checker-simple",
|
||||
"Perform simple path-sensitive checks.")
|
||||
|
||||
ANALYSIS(CheckerCFRef, "checker-cfref",
|
||||
"Run the [Core] Foundation reference count checker")
|
||||
|
||||
#undef ANALYSIS
|
|
@ -41,11 +41,9 @@ using namespace clang;
|
|||
// Basic type definitions.
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
namespace {
|
||||
|
||||
namespace {
|
||||
class AnalysisManager;
|
||||
typedef void (*CodeAction)(AnalysisManager& Mgr);
|
||||
|
||||
typedef void (*CodeAction)(AnalysisManager& Mgr);
|
||||
} // end anonymous namespace
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
@ -287,14 +285,14 @@ void AnalysisConsumer::HandleCode(Decl* D, Stmt* Body, Actions actions) {
|
|||
// Analyses
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
static void ActionDeadStores(AnalysisManager& mgr) {
|
||||
static void ActionWarnDeadStores(AnalysisManager& mgr) {
|
||||
if (LiveVariables* L = mgr.getLiveVariables()) {
|
||||
BugReporter BR(mgr);
|
||||
CheckDeadStores(*L, BR);
|
||||
}
|
||||
}
|
||||
|
||||
static void ActionUninitVals(AnalysisManager& mgr) {
|
||||
static void ActionWarnUninitVals(AnalysisManager& mgr) {
|
||||
if (CFG* c = mgr.getCFG())
|
||||
CheckUninitializedValues(*c, mgr.getContext(), mgr.getDiagnostic());
|
||||
}
|
||||
|
@ -327,7 +325,7 @@ static void ActionGRExprEngine(AnalysisManager& mgr, GRTransferFuncs* tf) {
|
|||
Eng.ViewGraph(mgr.shouldTrimGraph());
|
||||
}
|
||||
|
||||
static void ActionRefLeakCheckerAux(AnalysisManager& mgr, bool GCEnabled,
|
||||
static void ActionCheckerCFRefAux(AnalysisManager& mgr, bool GCEnabled,
|
||||
bool StandardWarnings) {
|
||||
|
||||
GRTransferFuncs* TF = MakeCFRefCountTF(mgr.getContext(),
|
||||
|
@ -338,31 +336,31 @@ static void ActionRefLeakCheckerAux(AnalysisManager& mgr, bool GCEnabled,
|
|||
ActionGRExprEngine(mgr, TF);
|
||||
}
|
||||
|
||||
static void ActionRefLeakChecker(AnalysisManager& mgr) {
|
||||
static void ActionCheckerCFRef(AnalysisManager& mgr) {
|
||||
|
||||
switch (mgr.getLangOptions().getGCMode()) {
|
||||
default:
|
||||
assert (false && "Invalid GC mode.");
|
||||
case LangOptions::NonGC:
|
||||
ActionRefLeakCheckerAux(mgr, false, true);
|
||||
ActionCheckerCFRefAux(mgr, false, true);
|
||||
break;
|
||||
|
||||
case LangOptions::GCOnly:
|
||||
ActionRefLeakCheckerAux(mgr, true, true);
|
||||
ActionCheckerCFRefAux(mgr, true, true);
|
||||
break;
|
||||
|
||||
case LangOptions::HybridGC:
|
||||
ActionRefLeakCheckerAux(mgr, false, true);
|
||||
ActionRefLeakCheckerAux(mgr, true, false);
|
||||
ActionCheckerCFRefAux(mgr, false, true);
|
||||
ActionCheckerCFRefAux(mgr, true, false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void ActionSimpleChecks(AnalysisManager& mgr) {
|
||||
static void ActionCheckerSimple(AnalysisManager& mgr) {
|
||||
ActionGRExprEngine(mgr, MakeGRSimpleValsTF());
|
||||
}
|
||||
|
||||
static void ActionLiveness(AnalysisManager& mgr) {
|
||||
static void ActionDisplayLiveVariables(AnalysisManager& mgr) {
|
||||
if (LiveVariables* L = mgr.getLiveVariables()) {
|
||||
mgr.DisplayFunction();
|
||||
L->dumpBlockLiveness(mgr.getSourceManager());
|
||||
|
@ -383,14 +381,14 @@ static void ActionCFGView(AnalysisManager& mgr) {
|
|||
}
|
||||
}
|
||||
|
||||
static void ActionCheckObjCDealloc(AnalysisManager& mgr) {
|
||||
static void ActionWarnObjCDealloc(AnalysisManager& mgr) {
|
||||
BugReporter BR(mgr);
|
||||
|
||||
CheckObjCDealloc(cast<ObjCImplementationDecl>(mgr.getCodeDecl()),
|
||||
mgr.getLangOptions(), BR);
|
||||
}
|
||||
|
||||
static void ActionCheckObjCInstMethSignature(AnalysisManager& mgr) {
|
||||
static void ActionWarnObjCMethSigs(AnalysisManager& mgr) {
|
||||
BugReporter BR(mgr);
|
||||
|
||||
CheckObjCInstMethSignature(cast<ObjCImplementationDecl>(mgr.getCodeDecl()),
|
||||
|
@ -416,45 +414,14 @@ ASTConsumer* clang::CreateAnalysisConsumer(Analyses* Beg, Analyses* End,
|
|||
|
||||
for ( ; Beg != End ; ++Beg)
|
||||
switch (*Beg) {
|
||||
case WarnDeadStores:
|
||||
C->addCodeAction(&ActionDeadStores);
|
||||
#define ANALYSIS(NAME, CMD, DESC)\
|
||||
case NAME:\
|
||||
C->addCodeAction(&Action ## NAME);\
|
||||
break;
|
||||
|
||||
case WarnUninitVals:
|
||||
C->addCodeAction(&ActionUninitVals);
|
||||
break;
|
||||
|
||||
case CheckObjCMethSigs:
|
||||
C->addObjCImplementationAction(&ActionCheckObjCInstMethSignature);
|
||||
break;
|
||||
|
||||
case DisplayLiveVariables:
|
||||
C->addCodeAction(&ActionLiveness);
|
||||
break;
|
||||
|
||||
case CheckerCFRef:
|
||||
C->addCodeAction(&ActionRefLeakChecker);
|
||||
break;
|
||||
|
||||
case CheckerSimple:
|
||||
C->addCodeAction(&ActionSimpleChecks);
|
||||
break;
|
||||
|
||||
case CFGDump:
|
||||
C->addCodeAction(&ActionCFGDump);
|
||||
break;
|
||||
|
||||
case CFGView:
|
||||
C->addCodeAction(&ActionCFGView);
|
||||
break;
|
||||
|
||||
#include "Analyses.def"
|
||||
default: break;
|
||||
}
|
||||
|
||||
// Checks we always perform:
|
||||
if (lopts.getGCMode() != LangOptions::GCOnly)
|
||||
C->addObjCImplementationAction(&ActionCheckObjCDealloc);
|
||||
|
||||
return C.take();
|
||||
}
|
||||
|
||||
|
|
|
@ -17,16 +17,11 @@
|
|||
namespace clang {
|
||||
|
||||
enum Analyses {
|
||||
CFGDump,
|
||||
CFGView,
|
||||
WarnDeadStores,
|
||||
WarnUninitVals,
|
||||
DisplayLiveVariables,
|
||||
CheckerCFRef,
|
||||
CheckerSimple,
|
||||
CheckObjCMethSigs
|
||||
#define ANALYSIS(NAME, CMDFLAG, DESC) NAME,
|
||||
#include "Analyses.def"
|
||||
NumAnalyses
|
||||
};
|
||||
|
||||
|
||||
ASTConsumer* CreateAnalysisConsumer(Analyses* Beg, Analyses* End,
|
||||
Diagnostic &diags, Preprocessor* pp,
|
||||
PreprocessorFactory* ppf,
|
||||
|
|
|
@ -162,21 +162,10 @@ AnalyzeAll("checker-opt-analyze-headers",
|
|||
static llvm::cl::list<Analyses>
|
||||
AnalysisList(llvm::cl::desc("Available Source Code Analyses:"),
|
||||
llvm::cl::values(
|
||||
clEnumValN(CFGDump, "cfg-dump", "Display Control-Flow Graphs"),
|
||||
clEnumValN(CFGView, "cfg-view", "View Control-Flow Graphs using GraphViz"),
|
||||
clEnumValN(DisplayLiveVariables, "dump-live-variables",
|
||||
"Print results of live variable analysis"),
|
||||
clEnumValN(WarnDeadStores, "warn-dead-stores",
|
||||
"Flag warnings of stores to dead variables"),
|
||||
clEnumValN(WarnUninitVals, "warn-uninit-values",
|
||||
"Flag warnings of uses of unitialized variables"),
|
||||
clEnumValN(CheckObjCMethSigs, "check-objc-methodsigs",
|
||||
"Check the Objective-C method signatures for type incompatibilities."),
|
||||
clEnumValN(CheckerSimple, "checker-simple",
|
||||
"Perform simple path-sensitive checks."),
|
||||
clEnumValN(CheckerCFRef, "checker-cfref",
|
||||
"Run the [Core] Foundation reference count checker"),
|
||||
clEnumValEnd));
|
||||
#define ANALYSIS(NAME, CMDFLAG, DESC)\
|
||||
clEnumValN(NAME, CMDFLAG, DESC),
|
||||
#include "Analyses.def"
|
||||
clEnumValEnd));
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Language Options
|
||||
|
|
Загрузка…
Ссылка в новой задаче