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:36:03 PDT 2019


It was an easy fix! In case any problem persists I will revert the commit
with the fix itself.

On Fri, 9 Aug 2019 at 17:16, Gábor Horváth <xazax.hun at gmail.com> wrote:

> 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/89c6327b/attachment-0001.html>


More information about the cfe-commits mailing list