Submitted as r207715 -Alex
On Wed, Apr 30, 2014 at 3:31 PM, Richard Smith <[email protected]>wrote: > LGTM > On 30 Apr 2014 15:24, "Alex McCarthy" <[email protected]> wrote: > >> Fix pending in http://reviews.llvm.org/D3578 . Mind taking a look? >> >> Thanks for your keen eyes! >> >> -Alex >> >> >> On Wed, Apr 30, 2014 at 3:08 PM, Alex McCarthy <[email protected]> wrote: >> >>> Oops, good catch, I'll get right on that. (Sorry about that: my C++ is >>> rusty, I forgot that members aren't safely default initialized) >>> >>> -Alex >>> >>> >>> On Wed, Apr 30, 2014 at 2:51 PM, Richard Smith <[email protected]>wrote: >>> >>>> 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
