r368499 - Attempt to reapply "Even more warnings utilizing gsl::Owner/gsl::Pointer annotations"

Nico Weber via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 9 17:13:28 PDT 2019


http://lab.llvm.org:8011/builders/clang-with-lto-ubuntu/builds/14045

FAILED:
tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/ASTConsumers.cpp.o

/home/buildslave/buildslave1a/clang-with-lto-ubuntu/install/stage1/bin/clang++
  -DGTEST_HAS_RTTI=0 -D_DEBUG -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -Itools/clang/lib/Frontend
-I/home/buildslave/buildslave1a/clang-with-lto-ubuntu/llvm.src/tools/clang/lib/Frontend
-I/home/buildslave/buildslave1a/clang-with-lto-ubuntu/llvm.src/tools/clang/include
-Itools/clang/include -Iinclude
-I/home/buildslave/buildslave1a/clang-with-lto-ubuntu/llvm.src/include
-fPIC -fvisibility-inlines-hidden -Werror -Werror=date-time
-Werror=unguarded-availability-new -std=c++11 -Wall -Wextra
-Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wmissing-field-initializers -pedantic -Wno-long-long
-Wimplicit-fallthrough -Wcovered-switch-default -Wno-noexcept-type
-Wnon-virtual-dtor -Wdelete-non-virtual-dtor -Wstring-conversion
-fdiagnostics-color -ffunction-sections -fdata-sections -fno-common
-Woverloaded-virtual -Wno-nested-anon-types -O3    -UNDEBUG
 -fno-exceptions -fno-rtti -MD -MT
tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/ASTConsumers.cpp.o
-MF
tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/ASTConsumers.cpp.o.d
-o
tools/clang/lib/Frontend/CMakeFiles/obj.clangFrontend.dir/ASTConsumers.cpp.o
-c
/home/buildslave/buildslave1a/clang-with-lto-ubuntu/llvm.src/tools/clang/lib/Frontend/ASTConsumers.cpp
/home/buildslave/buildslave1a/clang-with-lto-ubuntu/llvm.src/tools/clang/lib/Frontend/ASTConsumers.cpp:40:22:
error: binding reference member 'Out' to stack allocated parameter 'Out'
[-Werror,-Wdangling-field]
        : Out(Out ? *Out : llvm::outs()), OwnedOut(std::move(Out)),
                     ^~~
/home/buildslave/buildslave1a/clang-with-lto-ubuntu/llvm.src/tools/clang/lib/Frontend/ASTConsumers.cpp:98:18:
note: reference member declared here
    raw_ostream &Out;
                 ^
1 error generated.

http://llvm-cs.pcc.me.uk/tools/clang/lib/Frontend/ASTConsumers.cpp#40

That looks like a false positive.

On Fri, Aug 9, 2019 at 7:02 PM Gabor Horvath via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: xazax
> Date: Fri Aug  9 16:03:50 2019
> New Revision: 368499
>
> URL: http://llvm.org/viewvc/llvm-project?rev=368499&view=rev
> Log:
> Attempt to reapply "Even more warnings utilizing gsl::Owner/gsl::Pointer
> annotations"
>
> Modified:
>     cfe/trunk/lib/Sema/SemaInit.cpp
>     cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp
>
> Modified: cfe/trunk/lib/Sema/SemaInit.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=368499&r1=368498&r2=368499&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaInit.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaInit.cpp Fri Aug  9 16:03:50 2019
> @@ -6568,19 +6568,33 @@ static bool shouldTrackImplicitObjectArg
>    if (auto *Conv = dyn_cast_or_null<CXXConversionDecl>(Callee))
>      if (isRecordWithAttr<PointerAttr>(Conv->getConversionType()))
>        return true;
> -  if (!Callee->getParent()->isInStdNamespace() ||
> !Callee->getIdentifier())
> +  if (!Callee->getParent()->isInStdNamespace())
>      return false;
>    if (!isRecordWithAttr<PointerAttr>(Callee->getThisObjectType()) &&
>        !isRecordWithAttr<OwnerAttr>(Callee->getThisObjectType()))
>      return false;
> -  if (!isRecordWithAttr<PointerAttr>(Callee->getReturnType()) &&
> -      !Callee->getReturnType()->isPointerType())
> -    return false;
> -  return llvm::StringSwitch<bool>(Callee->getName())
> -      .Cases("begin", "rbegin", "cbegin", "crbegin", true)
> -      .Cases("end", "rend", "cend", "crend", true)
> -      .Cases("c_str", "data", "get", true)
> -      .Default(false);
> +  if (Callee->getReturnType()->isPointerType() ||
> +      isRecordWithAttr<PointerAttr>(Callee->getReturnType())) {
> +    if (!Callee->getIdentifier())
> +      return false;
> +    return llvm::StringSwitch<bool>(Callee->getName())
> +        .Cases("begin", "rbegin", "cbegin", "crbegin", true)
> +        .Cases("end", "rend", "cend", "crend", true)
> +        .Cases("c_str", "data", "get", true)
> +        // Map and set types.
> +        .Cases("find", "equal_range", "lower_bound", "upper_bound", true)
> +        .Default(false);
> +  } else if (Callee->getReturnType()->isReferenceType()) {
> +    if (!Callee->getIdentifier()) {
> +      auto OO = Callee->getOverloadedOperator();
> +      return OO == OverloadedOperatorKind::OO_Subscript ||
> +             OO == OverloadedOperatorKind::OO_Star;
> +    }
> +    return llvm::StringSwitch<bool>(Callee->getName())
> +        .Cases("front", "back", "at", true)
> +        .Default(false);
> +  }
> +  return false;
>  }
>
>  static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call,
> @@ -6600,6 +6614,12 @@ static void handleGslAnnotatedTypes(Indi
>      if (MD && shouldTrackImplicitObjectArg(MD))
>        VisitPointerArg(MD, MCE->getImplicitObjectArgument());
>      return;
> +  } else if (auto *OCE = dyn_cast<CXXOperatorCallExpr>(Call)) {
> +    FunctionDecl *Callee = OCE->getDirectCallee();
> +    if (Callee && Callee->isCXXInstanceMember() &&
> +        shouldTrackImplicitObjectArg(cast<CXXMethodDecl>(Callee)))
> +      VisitPointerArg(Callee, OCE->getArg(0));
> +    return;
>    }
>
>    if (auto *CCE = dyn_cast<CXXConstructExpr>(Call)) {
>
> Modified: cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp?rev=368499&r1=368498&r2=368499&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp (original)
> +++ cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp Fri Aug  9
> 16:03:50 2019
> @@ -121,24 +121,47 @@ void initLocalGslPtrWithTempOwner() {
>
>  namespace std {
>  template <typename T>
> -struct basic_iterator {};
> +struct basic_iterator {
> +  basic_iterator operator++();
> +  T& operator*();
> +};
> +
> +template<typename T>
> +bool operator!=(basic_iterator<T>, basic_iterator<T>);
>
>  template <typename T>
>  struct vector {
>    typedef basic_iterator<T> iterator;
>    iterator begin();
> +  iterator end();
>    T *data();
> +  T &at(int n);
> +};
> +
> +template<typename T>
> +struct basic_string_view {
> +  basic_string_view(const T *);
> +  const T *begin() const;
>  };
>
>  template<typename T>
>  struct basic_string {
>    const T *c_str() const;
> +  operator basic_string_view<T> () const;
>  };
>
> +
>  template<typename T>
>  struct unique_ptr {
>    T *get() const;
>  };
> +
> +template<typename T>
> +struct optional {
> +  optional();
> +  optional(const T&);
> +  T &operator*();
> +};
>  }
>
>  void modelIterators() {
> @@ -168,3 +191,29 @@ int *danglingUniquePtrFromTemp() {
>  int *danglingUniquePtrFromTemp2() {
>    return std::unique_ptr<int>().get(); // expected-warning {{returning
> address of local temporary object}}
>  }
> +
> +void danglingReferenceFromTempOwner() {
> +  int &r = *std::optional<int>(); // expected-warning {{object backing
> the pointer will be destroyed at the end of the full-expression}}
> +  int &r2 = *std::optional<int>(5); // expected-warning {{object backing
> the pointer will be destroyed at the end of the full-expression}}
> +  int &r3 = std::vector<int>().at(3); // expected-warning {{object
> backing the pointer will be destroyed at the end of the full-expression}}
> +}
> +
> +std::vector<int> getTempVec();
> +std::optional<std::vector<int>> getTempOptVec();
> +
> +int &usedToBeFalsePositive(std::vector<int> &v) {
> +  std::vector<int>::iterator it = v.begin();
> +  int& value = *it;
> +  return value; // ok
> +}
> +
> +int &doNotFollowReferencesForLocalOwner() {
> +  std::unique_ptr<int> localOwner;
> +  int &p = *localOwner.get();
> +  // In real world code localOwner is usually moved here.
> +  return p; // ok
> +}
> +
> +const char *trackThroughMultiplePointer() {
> +  return std::basic_string_view<char>(std::basic_string<char>()).begin();
> // expected-warning {{returning address of local temporary object}}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20190809/a38ee63e/attachment-0001.html>


More information about the cfe-commits mailing list