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

Gábor Horváth via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 9 17:16:37 PDT 2019


Indeed!

There pointer is moved later on! Interestingly, I run these warnings on
300+ projects and none of them had this pattern. Will revert or fix the
patch soon.

On Fri, 9 Aug 2019 at 17:13, Nico Weber <thakis at chromium.org> wrote:

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


More information about the cfe-commits mailing list