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
