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 <tha...@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@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@lists.llvm.org >> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits >> >
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits