Provide the option to run the CF-retain checker in GC enabled mode.

The transfer functions for the checker don't do anything special yet in GC mode.


git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@50394 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Ted Kremenek 2008-04-29 05:13:59 +00:00
Родитель dd6cec16e9
Коммит e5c30122ca
5 изменённых файлов: 58 добавлений и 29 удалений

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

@ -690,7 +690,7 @@ public:
virtual bool printFuncDeclStart() { return false; }
virtual const char* getCheckerName() = 0;
virtual GRTransferFuncs* getTransferFunctions() = 0;
virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) = 0;
};
} // end anonymous namespace
@ -732,22 +732,30 @@ void CheckerConsumer::VisitCFG(CFG& C, Decl& CD) {
else
llvm::cerr << '\n';
// Construct the analysis engine.
GRExprEngine Eng(C, CD, *Ctx);
std::vector<GRTransferFuncs*> TFs;
getTransferFunctions(TFs);
// Set base transfer functions.
llvm::OwningPtr<GRTransferFuncs> TF(getTransferFunctions());
Eng.setTransferFunctions(TF.get());
// Execute the worklist algorithm.
Eng.ExecuteWorkList();
// Display warnings.
Eng.EmitWarnings(Diags, PD.get());
#ifndef NDEBUG
if (Visualize) Eng.ViewGraph(TrimGraph);
#endif
while (!TFs.empty()) {
// Construct the analysis engine.
GRExprEngine Eng(C, CD, *Ctx);
// Set base transfer functions.
llvm::OwningPtr<GRTransferFuncs> TF(TFs.back());
TFs.pop_back();
Eng.setTransferFunctions(TF.get());
// Execute the worklist algorithm.
Eng.ExecuteWorkList();
// Display warnings.
Eng.EmitWarnings(Diags, PD.get());
#ifndef NDEBUG
if (Visualize) Eng.ViewGraph(TrimGraph);
#endif
}
}
//===----------------------------------------------------------------------===//
@ -765,8 +773,8 @@ public:
virtual const char* getCheckerName() { return "GRSimpleVals"; }
virtual GRTransferFuncs* getTransferFunctions() {
return MakeGRSimpleValsTF();
virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) {
return TFs.push_back(MakeGRSimpleValsTF());
}
};
} // end anonymous namespace
@ -789,19 +797,34 @@ ASTConsumer* clang::CreateGRSimpleVals(Diagnostic &Diags,
namespace {
class CFRefCountCheckerVisitor : public CheckerConsumer {
const LangOptions& LangOpts;
public:
CFRefCountCheckerVisitor(Diagnostic &diags, Preprocessor* pp,
PreprocessorFactory* ppf,
const LangOptions& lopts,
const std::string& fname,
const std::string& htmldir,
bool visualize, bool trim, bool analyzeAll)
: CheckerConsumer(diags, pp, ppf, fname, htmldir, visualize,
trim, analyzeAll) {}
trim, analyzeAll), LangOpts(lopts) {}
virtual const char* getCheckerName() { return "CFRefCountChecker"; }
virtual GRTransferFuncs* getTransferFunctions() {
return MakeCFRefCountTF(*Ctx);
virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) {
switch (LangOpts.getGCMode()) {
case LangOptions::NonGC:
TFs.push_back(MakeCFRefCountTF(*Ctx, false));
break;
case LangOptions::GCOnly:
TFs.push_back(MakeCFRefCountTF(*Ctx, true));
break;
case LangOptions::HybridGC:
TFs.push_back(MakeCFRefCountTF(*Ctx, false));
TFs.push_back(MakeCFRefCountTF(*Ctx, true));
break;
}
}
};
} // end anonymous namespace
@ -809,13 +832,15 @@ public:
ASTConsumer* clang::CreateCFRefChecker(Diagnostic &Diags,
Preprocessor* PP,
PreprocessorFactory* PPF,
const LangOptions& LangOpts,
const std::string& FunctionName,
const std::string& HTMLDir,
bool Visualize, bool TrimGraph,
bool AnalyzeAll) {
return new CFRefCountCheckerVisitor(Diags, PP, PPF, FunctionName, HTMLDir,
Visualize, TrimGraph, AnalyzeAll);
return new CFRefCountCheckerVisitor(Diags, PP, PPF, LangOpts, FunctionName,
HTMLDir, Visualize, TrimGraph,
AnalyzeAll);
}
//===----------------------------------------------------------------------===//

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

@ -53,6 +53,7 @@ ASTConsumer *CreateGRSimpleVals(Diagnostic &Diags,
ASTConsumer *CreateCFRefChecker(Diagnostic &Diags,
Preprocessor* PP, PreprocessorFactory* PPF,
const LangOptions& LangOpts,
const std::string& Function,
const std::string& HTMLDir, bool Visualize,
bool TrimGraph, bool AnalyzeAll);

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

@ -1132,7 +1132,8 @@ static ASTConsumer* CreateASTConsumer(const std::string& InFile,
OutputFile, VisualizeEG, TrimGraph, AnalyzeAll);
case CheckerCFRef:
return CreateCFRefChecker(Diag, PP, PPF, AnalyzeSpecificFunction,
return CreateCFRefChecker(Diag, PP, PPF, LangOpts,
AnalyzeSpecificFunction,
OutputFile, VisualizeEG, TrimGraph, AnalyzeAll);
case TestSerialization:

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

@ -31,7 +31,7 @@ void CheckUninitializedValues(CFG& cfg, ASTContext& Ctx, Diagnostic& Diags,
bool FullUninitTaint=false);
GRTransferFuncs* MakeGRSimpleValsTF();
GRTransferFuncs* MakeCFRefCountTF(ASTContext& Ctx);
GRTransferFuncs* MakeCFRefCountTF(ASTContext& Ctx, bool GCEnabled);
BugType* MakeDeadStoresChecker();
} // end namespace clang

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

@ -590,7 +590,8 @@ public:
private:
// Instance variables.
CFRefSummaryManager Summaries;
CFRefSummaryManager Summaries;
const bool GCEnabled;
RefBFactoryTy RefBFactory;
UseAfterReleasesTy UseAfterReleases;
@ -636,8 +637,9 @@ private:
public:
CFRefCount(ASTContext& Ctx)
CFRefCount(ASTContext& Ctx, bool gcenabled)
: Summaries(Ctx),
GCEnabled(gcenabled),
RetainSelector(GetUnarySelector("retain", Ctx)),
ReleaseSelector(GetUnarySelector("release", Ctx)) {}
@ -1575,6 +1577,6 @@ void Leak::GetErrorNodes(std::vector<ExplodedNode<ValueState>*>& Nodes) {
// Transfer function creation for external clients.
//===----------------------------------------------------------------------===//
GRTransferFuncs* clang::MakeCFRefCountTF(ASTContext& Ctx) {
return new CFRefCount(Ctx);
GRTransferFuncs* clang::MakeCFRefCountTF(ASTContext& Ctx, bool GCEnabled) {
return new CFRefCount(Ctx, GCEnabled);
}