[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:24:13 PDT 2014


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


More information about the cfe-commits mailing list