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

Alex McCarthy alexmc at google.com
Wed Apr 30 15:40:34 PDT 2014


Submitted as r207715

-Alex


On Wed, Apr 30, 2014 at 3:31 PM, Richard Smith <richard at metafoo.co.uk>wrote:

> 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/5eae6e38/attachment.html>


More information about the cfe-commits mailing list