diff options
author | Ted Kremenek <kremenek@apple.com> | 2008-05-02 18:01:49 +0000 |
---|---|---|
committer | Ted Kremenek <kremenek@apple.com> | 2008-05-02 18:01:49 +0000 |
commit | 789942cfda5fdde58c07b5912922e408b1d386cd (patch) | |
tree | 128f6b635002890e1eaf5941e3ad04cdc336a04b /clang | |
parent | a06e7120bb62bca7448b0180f88812b425e1d70f (diff) | |
download | bcm5719-llvm-789942cfda5fdde58c07b5912922e408b1d386cd.tar.gz bcm5719-llvm-789942cfda5fdde58c07b5912922e408b1d386cd.zip |
When running the reference count checker twice (GC and non-GC mode), only emit
basic warnings (dead stores, null dereferences) on the first pass.
llvm-svn: 50584
Diffstat (limited to 'clang')
-rw-r--r-- | clang/Driver/ASTConsumers.cpp | 8 | ||||
-rw-r--r-- | clang/include/clang/Analysis/LocalCheckers.h | 3 | ||||
-rw-r--r-- | clang/lib/Analysis/CFRefCount.cpp | 12 |
3 files changed, 14 insertions, 9 deletions
diff --git a/clang/Driver/ASTConsumers.cpp b/clang/Driver/ASTConsumers.cpp index 59e477ab65e..684b11eaedb 100644 --- a/clang/Driver/ASTConsumers.cpp +++ b/clang/Driver/ASTConsumers.cpp @@ -813,16 +813,16 @@ public: virtual void getTransferFunctions(std::vector<GRTransferFuncs*>& TFs) { switch (LangOpts.getGCMode()) { case LangOptions::NonGC: - TFs.push_back(MakeCFRefCountTF(*Ctx, false, LangOpts)); + TFs.push_back(MakeCFRefCountTF(*Ctx, false, true, LangOpts)); break; case LangOptions::GCOnly: - TFs.push_back(MakeCFRefCountTF(*Ctx, true, LangOpts)); + TFs.push_back(MakeCFRefCountTF(*Ctx, true, true, LangOpts)); break; case LangOptions::HybridGC: - TFs.push_back(MakeCFRefCountTF(*Ctx, false, LangOpts)); - TFs.push_back(MakeCFRefCountTF(*Ctx, true, LangOpts)); + TFs.push_back(MakeCFRefCountTF(*Ctx, false, true, LangOpts)); + TFs.push_back(MakeCFRefCountTF(*Ctx, true, false, LangOpts)); break; } } diff --git a/clang/include/clang/Analysis/LocalCheckers.h b/clang/include/clang/Analysis/LocalCheckers.h index 64dc4dd90fa..530bf90e7e4 100644 --- a/clang/include/clang/Analysis/LocalCheckers.h +++ b/clang/include/clang/Analysis/LocalCheckers.h @@ -32,7 +32,8 @@ void CheckUninitializedValues(CFG& cfg, ASTContext& Ctx, Diagnostic& Diags, bool FullUninitTaint=false); GRTransferFuncs* MakeGRSimpleValsTF(); -GRTransferFuncs* MakeCFRefCountTF(ASTContext& Ctx, bool GCEnabled, +GRTransferFuncs* MakeCFRefCountTF(ASTContext& Ctx, bool GCEnabled, + bool StandardWarnings, const LangOptions& lopts); BugType* MakeDeadStoresChecker(); diff --git a/clang/lib/Analysis/CFRefCount.cpp b/clang/lib/Analysis/CFRefCount.cpp index e62632cad8f..c3da51bd125 100644 --- a/clang/lib/Analysis/CFRefCount.cpp +++ b/clang/lib/Analysis/CFRefCount.cpp @@ -626,7 +626,8 @@ private: // Instance variables. CFRefSummaryManager Summaries; - const bool GCEnabled; + const bool GCEnabled; + const bool EmitStandardWarnings; const LangOptions& LOpts; RefBFactoryTy RefBFactory; @@ -674,9 +675,11 @@ private: public: - CFRefCount(ASTContext& Ctx, bool gcenabled, const LangOptions& lopts) + CFRefCount(ASTContext& Ctx, bool gcenabled, bool StandardWarnings, + const LangOptions& lopts) : Summaries(Ctx, gcenabled), GCEnabled(gcenabled), + EmitStandardWarnings(StandardWarnings), LOpts(lopts), RetainSelector(GetNullarySelector("retain", Ctx)), ReleaseSelector(GetNullarySelector("release", Ctx)), @@ -1539,7 +1542,7 @@ namespace { } // end anonymous namespace void CFRefCount::RegisterChecks(GRExprEngine& Eng) { - GRSimpleVals::RegisterChecks(Eng); + if (EmitStandardWarnings) GRSimpleVals::RegisterChecks(Eng); Eng.Register(new UseAfterRelease(*this)); Eng.Register(new BadRelease(*this)); Eng.Register(new Leak(*this)); @@ -1793,6 +1796,7 @@ void Leak::GetErrorNodes(std::vector<ExplodedNode<ValueState>*>& Nodes) { //===----------------------------------------------------------------------===// GRTransferFuncs* clang::MakeCFRefCountTF(ASTContext& Ctx, bool GCEnabled, + bool StandardWarnings, const LangOptions& lopts) { - return new CFRefCount(Ctx, GCEnabled, lopts); + return new CFRefCount(Ctx, GCEnabled, StandardWarnings, lopts); } |