[clang-tools-extra] r207652 - Add a clang-tidy flag to support temporary destructor-aware analysis (workaround for bug 15599).

Richard Smith richard at metafoo.co.uk
Wed Apr 30 15:31:22 PDT 2014


LGTM
On 30 Apr 2014 15:24, "Alex McCarthy" <alexmc at google.com> 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 <alexmc at google.com> 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 <richard at metafoo.co.uk>wrote:
>>
>>> On Wed, Apr 30, 2014 at 7:09 AM, Alex McCarthy <alexmc at google.com>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
>>>> cfe-commits at cs.uiuc.edu
>>>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>>>
>>>
>>>
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20140430/4bf29487/attachment.html>


More information about the cfe-commits mailing list