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:
Ted Kremenek 2008-07-14 23:41:13 +00:00
Родитель 8f2698621f
Коммит fb9a48cf5e
4 изменённых файлов: 67 добавлений и 75 удалений

41
Driver/Analyses.def Normal file
Просмотреть файл

@ -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

Просмотреть файл

@ -42,10 +42,8 @@ using namespace clang;
//===----------------------------------------------------------------------===//
namespace {
class AnalysisManager;
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,14 +17,9 @@
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,

Просмотреть файл

@ -162,20 +162,9 @@ 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"),
#define ANALYSIS(NAME, CMDFLAG, DESC)\
clEnumValN(NAME, CMDFLAG, DESC),
#include "Analyses.def"
clEnumValEnd));
//===----------------------------------------------------------------------===//