On Wed, Apr 30, 2014 at 7:09 AM, Alex McCarthy <[email protected]> wrote:
> Author: alexmc > Date: Wed Apr 30 09:09:24 2014 > New Revision: 207652 > > URL: http://llvm.org/viewvc/llvm-project?rev=207652&view=rev > Log: > Add a clang-tidy flag to support temporary destructor-aware analysis > (workaround for bug 15599). > > Reviewers: alexfh > > Subscribers: jordan_rose, klimek, djasper, cfe-commits > > Differential Revision: http://reviews.llvm.org/D3556 > > Added: > clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp > Modified: > clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp > clang-tools-extra/trunk/clang-tidy/ClangTidy.h > clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h > clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp > > Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp?rev=207652&r1=207651&r2=207652&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp (original) > +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.cpp Wed Apr 30 09:09:24 > 2014 > @@ -173,8 +173,9 @@ private: > } // namespace > > ClangTidyASTConsumerFactory::ClangTidyASTConsumerFactory( > - ClangTidyContext &Context) > - : Context(Context), CheckFactories(new ClangTidyCheckFactories) { > + ClangTidyContext &Context, const ClangTidyOptions &Options) > + : Context(Context), CheckFactories(new ClangTidyCheckFactories), > + Options(Options) { > for (ClangTidyModuleRegistry::iterator I = > ClangTidyModuleRegistry::begin(), > E = > ClangTidyModuleRegistry::end(); > I != E; ++I) { > @@ -207,16 +208,21 @@ clang::ASTConsumer *ClangTidyASTConsumer > if (!CheckFactories->empty()) > Consumers.push_back(Finder.newASTConsumer()); > > - AnalyzerOptionsRef Options = Compiler.getAnalyzerOpts(); > - Options->CheckersControlList = getCheckersControlList(); > - if (!Options->CheckersControlList.empty()) { > - Options->AnalysisStoreOpt = RegionStoreModel; > - Options->AnalysisDiagOpt = PD_NONE; > - Options->AnalyzeNestedBlocks = true; > - Options->eagerlyAssumeBinOpBifurcation = true; > + AnalyzerOptionsRef AnalyzerOptions = Compiler.getAnalyzerOpts(); > + // FIXME: Remove this option once clang's cfg-temporary-dtors option > defaults > + // to true. > + AnalyzerOptions->Config["cfg-temporary-dtors"] = > + Options.AnalyzeTemporaryDtors ? "true" : "false"; > + > + AnalyzerOptions->CheckersControlList = getCheckersControlList(); > + if (!AnalyzerOptions->CheckersControlList.empty()) { > + AnalyzerOptions->AnalysisStoreOpt = RegionStoreModel; > + AnalyzerOptions->AnalysisDiagOpt = PD_NONE; > + AnalyzerOptions->AnalyzeNestedBlocks = true; > + AnalyzerOptions->eagerlyAssumeBinOpBifurcation = true; > ento::AnalysisASTConsumer *AnalysisConsumer = > ento::CreateAnalysisConsumer( > Compiler.getPreprocessor(), Compiler.getFrontendOpts().OutputFile, > - Options, Compiler.getFrontendOpts().Plugins); > + AnalyzerOptions, Compiler.getFrontendOpts().Plugins); > AnalysisConsumer->AddDiagnosticConsumer( > new AnalyzerDiagnosticConsumer(Context)); > Consumers.push_back(AnalysisConsumer); > @@ -288,7 +294,7 @@ void ClangTidyCheck::setName(StringRef N > std::vector<std::string> getCheckNames(const ClangTidyOptions &Options) { > SmallVector<ClangTidyError, 8> Errors; > clang::tidy::ClangTidyContext Context(&Errors, Options); > - ClangTidyASTConsumerFactory Factory(Context); > + ClangTidyASTConsumerFactory Factory(Context, Options); > return Factory.getCheckNames(); > } > > @@ -326,7 +332,7 @@ void runClangTidy(const ClangTidyOptions > ClangTidyASTConsumerFactory *ConsumerFactory; > }; > > - Tool.run(new ActionFactory(new ClangTidyASTConsumerFactory(Context))); > + Tool.run(new ActionFactory(new ClangTidyASTConsumerFactory(Context, > Options))); > } > > void handleErrors(SmallVectorImpl<ClangTidyError> &Errors, bool Fix) { > > Modified: clang-tools-extra/trunk/clang-tidy/ClangTidy.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidy.h?rev=207652&r1=207651&r2=207652&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/ClangTidy.h (original) > +++ clang-tools-extra/trunk/clang-tidy/ClangTidy.h Wed Apr 30 09:09:24 2014 > @@ -94,7 +94,8 @@ class ClangTidyCheckFactories; > > class ClangTidyASTConsumerFactory { > public: > - ClangTidyASTConsumerFactory(ClangTidyContext &Context); > + ClangTidyASTConsumerFactory(ClangTidyContext &Context, > + const ClangTidyOptions &Options); > ~ClangTidyASTConsumerFactory(); > > /// \brief Returns an ASTConsumer that runs the specified clang-tidy > checks. > @@ -112,6 +113,7 @@ private: > ClangTidyContext &Context; > ast_matchers::MatchFinder Finder; > std::unique_ptr<ClangTidyCheckFactories> CheckFactories; > + ClangTidyOptions Options; > }; > > /// \brief Fills the list of check names that are enabled when the > provided > > Modified: clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h?rev=207652&r1=207651&r2=207652&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h (original) > +++ clang-tools-extra/trunk/clang-tidy/ClangTidyOptions.h Wed Apr 30 > 09:09:24 2014 > @@ -18,6 +18,7 @@ struct ClangTidyOptions { > ClangTidyOptions() : EnableChecksRegex(".*") {} > std::string EnableChecksRegex; > std::string DisableChecksRegex; > + bool AnalyzeTemporaryDtors; > It looks like default-constructed state of ClangTidyOptions is supposed to be a valid state. Please update the default constructor to initialize this member! > }; > > } // end namespace tidy > > Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=207652&r1=207651&r2=207652&view=diff > > ============================================================================== > --- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (original) > +++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Wed Apr 30 > 09:09:24 2014 > @@ -46,12 +46,20 @@ static cl::opt<bool> ListChecks("list-ch > cl::desc("List all enabled checks and > exit."), > cl::init(false), > cl::cat(ClangTidyCategory)); > > +static cl::opt<bool> AnalyzeTemporaryDtors( > + "analyze-temporary-dtors", > + cl::desc("Enable temporary destructor-aware analysis in > clang-analyzer- " > + "checks."), > + cl::init(false), > + cl::cat(ClangTidyCategory)); > + > int main(int argc, const char **argv) { > CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory); > > clang::tidy::ClangTidyOptions Options; > Options.EnableChecksRegex = Checks; > Options.DisableChecksRegex = DisableChecks; > + Options.AnalyzeTemporaryDtors = AnalyzeTemporaryDtors; > > // FIXME: Allow using --list-checks without positional arguments. > if (ListChecks) { > > Added: clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp > URL: > http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp?rev=207652&view=auto > > ============================================================================== > --- clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp (added) > +++ clang-tools-extra/trunk/test/clang-tidy/temporaries.cpp Wed Apr 30 > 09:09:24 2014 > @@ -0,0 +1,26 @@ > +// RUN: clang-tidy -checks=clang-analyzer-core.NullDereference > -disable-checks='' -analyze-temporary-dtors %s -- > %t.log > +// FileCheck complains if the input file is empty, so add a dummy line. > +// RUN: echo foo >> %t.log > +// RUN: FileCheck %s < %t.log > + > +struct NoReturnDtor { > + ~NoReturnDtor() __attribute__((noreturn)); > +}; > + > +extern bool check(const NoReturnDtor &); > + > +// CHECK-NOT: warning > +void testNullPointerDereferencePositive() { > + int *value = 0; > + // CHECK: [[@LINE+1]]:10: warning: Dereference of null pointer (loaded > from variable 'value') [clang-analyzer-core.NullDereference] > + *value = 1; > +} > + > +// CHECK-NOT: warning > +void testNullPointerDereference() { > + int *value = 0; > + if (check(NoReturnDtor())) { > + // This unreachable code causes a warning if we don't run with > -analyze-temporary-dtors > + *value = 1; > + } > +} > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
