<div dir="ltr">Confirmed, after r368534 the Chromium builds looks good again. (r368528 without r368534 regressed something else, but r368534 fixed things. I'm assuming you don't need a repro for the breakage in r368528 without r368534.)<div><br></div><div>Your warnings even found a bug: <a href="https://bugs.chromium.org/p/openscreen/issues/detail?id=63">https://bugs.chromium.org/p/openscreen/issues/detail?id=63</a> Thanks! :)</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Aug 11, 2019 at 3:18 PM Gábor Horváth <<a href="mailto:xazax.hun@gmail.com">xazax.hun@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">This should be fixed now. </div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Aug 10, 2019, 8:08 PM Gábor Horváth <<a href="mailto:xazax.hun@gmail.com" target="_blank">xazax.hun@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">You are right!<div dir="auto"><br></div><div dir="auto">I will look into this tomorrow. If you think this is urgent feel free to revert the commits. </div><div dir="auto"><br></div><div dir="auto">Cheers,</div><div dir="auto">Gabor</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Aug 10, 2019, 6:41 PM Nico Weber <<a href="mailto:thakis@chromium.org" rel="noreferrer" target="_blank">thakis@chromium.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr">Hi Gabor,<br><div><br></div><div>this makes clang warn on this program:</div><div><br></div><div>$ cat test.cc<br>#include <algorithm><br>#include <vector><br><br>struct S {<br>  bool operator==(const S &rhs) const;<br>};<br><br>const S &f(const std::vector<S> &v) {<br>  const auto &it = std::find(v.rbegin(), v.rend(), S());<br>  return *it;<br>}<br><br><br>$ out/gn/bin/clang -c test.cc -isysroot $(xcrun -show-sdk-path) -isystem libcxx/include/ -Wall<br>test.cc:10:11: warning: returning reference to local temporary object [-Wreturn-stack-address]<br>  return *it;<br>          ^~<br>test.cc:9:15: note: binding reference variable 'it' here<br>  const auto &it = std::find(v.rbegin(), v.rend(), S());<br>              ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>1 warning generated.<br></div><div><br></div><div><br></div><div>Is the warning correct here? The `const auto &it` is lifetime-extended to the end of the block, and *it should return a reference to an element in the vector. Since the vector's passed in, this should be fine. Or am I missing something?</div><div><br></div><div>Thanks,</div><div>Nico</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Aug 9, 2019 at 11:15 AM Gabor Horvath via cfe-commits <<a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Author: xazax<br>
Date: Fri Aug  9 08:16:35 2019<br>
New Revision: 368446<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=368446&view=rev" rel="noreferrer noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=368446&view=rev</a><br>
Log:<br>
More warnings regarding gsl::Pointer and gsl::Owner attributes<br>
<br>
Differential Revision: <a href="https://reviews.llvm.org/D65120" rel="noreferrer noreferrer noreferrer" target="_blank">https://reviews.llvm.org/D65120</a><br>
<br>
Modified:<br>
    cfe/trunk/lib/Sema/SemaInit.cpp<br>
    cfe/trunk/test/Analysis/inner-pointer.cpp<br>
    cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp<br>
<br>
Modified: cfe/trunk/lib/Sema/SemaInit.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=368446&r1=368445&r2=368446&view=diff" rel="noreferrer noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaInit.cpp?rev=368446&r1=368445&r2=368446&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/Sema/SemaInit.cpp (original)<br>
+++ cfe/trunk/lib/Sema/SemaInit.cpp Fri Aug  9 08:16:35 2019<br>
@@ -6564,6 +6564,25 @@ template <typename T> static bool isReco<br>
   return false;<br>
 }<br>
<br>
+static bool shouldTrackImplicitObjectArg(const CXXMethodDecl *Callee) {<br>
+  if (auto *Conv = dyn_cast_or_null<CXXConversionDecl>(Callee))<br>
+    if (isRecordWithAttr<PointerAttr>(Conv->getConversionType()))<br>
+      return true;<br>
+  if (!Callee->getParent()->isInStdNamespace() || !Callee->getIdentifier())<br>
+    return false;<br>
+  if (!isRecordWithAttr<PointerAttr>(Callee->getThisObjectType()) &&<br>
+      !isRecordWithAttr<OwnerAttr>(Callee->getThisObjectType()))<br>
+    return false;<br>
+  if (!isRecordWithAttr<PointerAttr>(Callee->getReturnType()) &&<br>
+      !Callee->getReturnType()->isPointerType())<br>
+    return false;<br>
+  return llvm::StringSwitch<bool>(Callee->getName())<br>
+      .Cases("begin", "rbegin", "cbegin", "crbegin", true)<br>
+      .Cases("end", "rend", "cend", "crend", true)<br>
+      .Cases("c_str", "data", "get", true)<br>
+      .Default(false);<br>
+}<br>
+<br>
 static void handleGslAnnotatedTypes(IndirectLocalPath &Path, Expr *Call,<br>
                                     LocalVisitor Visit) {<br>
   auto VisitPointerArg = [&](const Decl *D, Expr *Arg) {<br>
@@ -6577,10 +6596,9 @@ static void handleGslAnnotatedTypes(Indi<br>
   };<br>
<br>
   if (auto *MCE = dyn_cast<CXXMemberCallExpr>(Call)) {<br>
-    const FunctionDecl *Callee = MCE->getDirectCallee();<br>
-    if (auto *Conv = dyn_cast_or_null<CXXConversionDecl>(Callee))<br>
-      if (isRecordWithAttr<PointerAttr>(Conv->getConversionType()))<br>
-        VisitPointerArg(Callee, MCE->getImplicitObjectArgument());<br>
+    const auto *MD = cast_or_null<CXXMethodDecl>(MCE->getDirectCallee());<br>
+    if (MD && shouldTrackImplicitObjectArg(MD))<br>
+      VisitPointerArg(MD, MCE->getImplicitObjectArgument());<br>
     return;<br>
   }<br>
<br>
<br>
Modified: cfe/trunk/test/Analysis/inner-pointer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inner-pointer.cpp?rev=368446&r1=368445&r2=368446&view=diff" rel="noreferrer noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Analysis/inner-pointer.cpp?rev=368446&r1=368445&r2=368446&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Analysis/inner-pointer.cpp (original)<br>
+++ cfe/trunk/test/Analysis/inner-pointer.cpp Fri Aug  9 08:16:35 2019<br>
@@ -1,4 +1,5 @@<br>
-// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.InnerPointer \<br>
+// RUN: %clang_analyze_cc1 -analyzer-checker=cplusplus.InnerPointer   \<br>
+// RUN:   -Wno-dangling -Wno-dangling-field -Wno-return-stack-address \<br>
 // RUN:   %s -analyzer-output=text -verify<br>
<br>
 #include "Inputs/system-header-simulator-cxx.h"<br>
<br>
Modified: cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp?rev=368446&r1=368445&r2=368446&view=diff" rel="noreferrer noreferrer noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp?rev=368446&r1=368445&r2=368446&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp (original)<br>
+++ cfe/trunk/test/Sema/warn-lifetime-analysis-nocfg.cpp Fri Aug  9 08:16:35 2019<br>
@@ -2,7 +2,6 @@<br>
 struct [[gsl::Owner(int)]] MyIntOwner {<br>
   MyIntOwner();<br>
   int &operator*();<br>
-  int *c_str() const;<br>
 };<br>
<br>
 struct [[gsl::Pointer(int)]] MyIntPointer {<br>
@@ -52,16 +51,6 @@ long *ownershipTransferToRawPointer() {<br>
   return t.releaseAsRawPointer(); // ok<br>
 }<br>
<br>
-int *danglingRawPtrFromLocal() {<br>
-  MyIntOwner t;<br>
-  return t.c_str(); // TODO<br>
-}<br>
-<br>
-int *danglingRawPtrFromTemp() {<br>
-  MyIntPointer p;<br>
-  return p.toOwner().c_str(); // TODO<br>
-}<br>
-<br>
 struct Y {<br>
   int a[4];<br>
 };<br>
@@ -103,6 +92,12 @@ MyIntPointer danglingGslPtrFromTemporary<br>
   return MyIntOwner{}; // expected-warning {{returning address of local temporary object}}<br>
 }<br>
<br>
+MyIntOwner makeTempOwner();<br>
+<br>
+MyIntPointer danglingGslPtrFromTemporary2() {<br>
+  return makeTempOwner(); // expected-warning {{returning address of local temporary object}}<br>
+}<br>
+<br>
 MyLongPointerFromConversion danglingGslPtrFromTemporaryConv() {<br>
   return MyLongOwnerWithConversion{}; // expected-warning {{returning address of local temporary object}}<br>
 }<br>
@@ -124,12 +119,52 @@ void initLocalGslPtrWithTempOwner() {<br>
   global2 = MyLongOwnerWithConversion{}; // TODO ?<br>
 }<br>
<br>
-struct IntVector {<br>
-  int *begin();<br>
-  int *end();<br>
+namespace std {<br>
+template <typename T><br>
+struct basic_iterator {};<br>
+<br>
+template <typename T><br>
+struct vector {<br>
+  typedef basic_iterator<T> iterator;<br>
+  iterator begin();<br>
+  T *data();<br>
+};<br>
+<br>
+template<typename T><br>
+struct basic_string {<br>
+  const T *c_str() const;<br>
+};<br>
+<br>
+template<typename T><br>
+struct unique_ptr {<br>
+  T *get() const;<br>
 };<br>
+}<br>
<br>
 void modelIterators() {<br>
-  int *it = IntVector{}.begin(); // TODO ?<br>
+  std::vector<int>::iterator it = std::vector<int>().begin(); // expected-warning {{object backing the pointer will be destroyed at the end of the full-expression}}<br>
   (void)it;<br>
 }<br>
+<br>
+std::vector<int>::iterator modelIteratorReturn() {<br>
+  return std::vector<int>().begin(); // expected-warning {{returning address of local temporary object}}<br>
+}<br>
+<br>
+const char *danglingRawPtrFromLocal() {<br>
+  std::basic_string<char> s;<br>
+  return s.c_str(); // expected-warning {{address of stack memory associated with local variable 's' returned}}<br>
+}<br>
+<br>
+const char *danglingRawPtrFromTemp() {<br>
+  return std::basic_string<char>().c_str(); // expected-warning {{returning address of local temporary object}}<br>
+}<br>
+<br>
+std::unique_ptr<int> getUniquePtr();<br>
+<br>
+int *danglingUniquePtrFromTemp() {<br>
+  return getUniquePtr().get(); // expected-warning {{returning address of local temporary object}}<br>
+}<br>
+<br>
+int *danglingUniquePtrFromTemp2() {<br>
+  return std::unique_ptr<int>().get(); // expected-warning {{returning address of local temporary object}}<br>
+}<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@lists.llvm.org" rel="noreferrer noreferrer" target="_blank">cfe-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits" rel="noreferrer noreferrer noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits</a><br>
</blockquote></div>
</blockquote></div>
</blockquote></div>
</blockquote></div>