From 030ccee01c7b46b56d89b97a4226599cbf68e1c1 Mon Sep 17 00:00:00 2001 From: George Burgess IV Date: Mon, 14 May 2018 16:30:46 -0700 Subject: [PATCH] Disable dtor inlining for clang-tidy LLVM r328258 turned on a feature called temporary dtor inlining by default for all of C++ in clang-tidy. This feature appears to be somewhat over-aggressive when objects are being passed by value. For example, given: void foo(std::unique_ptr i); void bar() { auto x = std::make_unique(); int *i = x.get(); foo(std::move(x)); *i = 99; } ...clang-tidy will complain about `*i = 99;` being a definite use-after-free. This is incorrect, however: `foo` could stash the `unique_ptr` it's given in a global, or a class member, or ... Until upstream fixes this bug, it's probably best to keep this disabled. Bug: None Test: Ran the analyzer across Android locally. Nothing broke; number of complaints dropped significantly. Change-Id: I806c7ead34b61f4a88a7e6ec1c94751836a21e70 --- cc/tidy.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/cc/tidy.go b/cc/tidy.go index 8ca94efc8..491cc22d1 100644 --- a/cc/tidy.go +++ b/cc/tidy.go @@ -83,9 +83,21 @@ func (tidy *tidyFeature) flags(ctx ModuleContext, flags Flags) Flags { flags.TidyFlags = append(flags.TidyFlags, "-extra-arg-before=-fno-caret-diagnostics") } - // We might be using the static analyzer through clang tidy. - // https://bugs.llvm.org/show_bug.cgi?id=32914 - flags.TidyFlags = append(flags.TidyFlags, "-extra-arg-before=-D__clang_analyzer__") + extraArgFlags := []string{ + // We might be using the static analyzer through clang tidy. + // https://bugs.llvm.org/show_bug.cgi?id=32914 + "-D__clang_analyzer__", + + // A recent change in clang-tidy (r328258) enabled destructor inlining, which + // appears to cause a number of false positives. Until that's resolved, this turns + // off the effects of r328258. + // https://bugs.llvm.org/show_bug.cgi?id=37459 + "-Xclang", "-analyzer-config", "-Xclang", "c++-temp-dtor-inlining=false", + } + + for _, f := range extraArgFlags { + flags.TidyFlags = append(flags.TidyFlags, "-extra-arg-before="+f) + } tidyChecks := "-checks=" if checks := ctx.Config().TidyChecks(); len(checks) > 0 {