public inbox for gcc-bugs@sourceware.org help / color / mirror / Atom feed
* [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended @ 2012-08-07 18:54 ppluzhnikov at google dot com 2012-08-07 19:56 ` [Bug c++/54197] " hjl.tools at gmail dot com ` (8 more replies) 0 siblings, 9 replies; 10+ messages in thread From: ppluzhnikov at google dot com @ 2012-08-07 18:54 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 Bug #: 54197 Summary: [4.7/4.8 regression] Lifetime of reference not properly extended Classification: Unclassified Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned@gcc.gnu.org ReportedBy: ppluzhnikov@google.com We've noticed this with 4.7 branch, confirmed present in current trunk (rev. 190209). When calling a static member function returning an object (string below) through an unnamed function pointer, and binding the result to a reference, the lifetime of the returned temporary is not properly extended. --- cut --- #include <stdlib.h> #include <string.h> #include <stdio.h> struct string { string(const char *s) { s_ = strdup(s); } ~string() { memset((void*)s_, 'a', strlen(s_)); } string(const string& rhs) { s_ = strdup(rhs.s_); } string& operator=(const string& rhs) { if (&rhs != this) { free((void*)s_); s_ = strdup(rhs.s_); } return *this; } const char *c_str() const { return s_; } const char *s_; }; struct Foo { static string foo() { return "abcd"; } }; Foo foo_g; struct scoped_ptr { Foo* operator->() const { return &foo_g; } Foo* get() const { return &foo_g; } }; Foo *get() { return &foo_g; } int main() { scoped_ptr f; const string& ref1 = f->foo(); // BAD const string& ref2 = f.get()->foo(); // BAD const string& ref3 = get()->foo(); // BAD const string& ref4 = Foo::foo(); // OK Foo *pf = f.get(); const string& ref5 = pf->foo(); // OK printf("ref1: %p (%s)\n", ref1.c_str(), ref1.c_str()); printf("ref2: %p (%s)\n", ref2.c_str(), ref2.c_str()); printf("ref3: %p (%s)\n", ref3.c_str(), ref3.c_str()); printf("ref4: %p (%s)\n", ref4.c_str(), ref4.c_str()); printf("ref5: %p (%s)\n", ref5.c_str(), ref5.c_str()); } --- cut --- Result from gcc-4.6: ref1: 0x5a8030 (abcd) ref2: 0x5a8070 (abcd) ref3: 0x5a80b0 (abcd) ref4: 0x5a80d0 (abcd) ref5: 0x5a80f0 (abcd) Result from gcc-4.7 / 4.8 ref1: 0xe18010 (aaaa) << BUG ref2: 0xe18030 (aaaa) << BUG ref3: 0xe18050 (aaaa) << BUG ref4: 0xe18070 (abcd) ref5: 0xe18090 (abcd) Changing Foo::foo to be non-static (and commenting out ref4), the bug disappears: ref1: 0x1eb3010 (abcd) ref2: 0x1eb3030 (abcd) ref3: 0x1eb3050 (abcd) ref5: 0x1eb3070 (abcd) Google ref: b/6946758 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com @ 2012-08-07 19:56 ` hjl.tools at gmail dot com 2012-08-08 7:54 ` rguenth at gcc dot gnu.org ` (7 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: hjl.tools at gmail dot com @ 2012-08-07 19:56 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 H.J. Lu <hjl.tools at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2012-08-07 CC| |jason at redhat dot com Ever Confirmed|0 |1 --- Comment #1 from H.J. Lu <hjl.tools at gmail dot com> 2012-08-07 19:55:37 UTC --- It is caused by revision 180944: http://gcc.gnu.org/ml/gcc-cvs/2011-11/msg00230.html ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com 2012-08-07 19:56 ` [Bug c++/54197] " hjl.tools at gmail dot com @ 2012-08-08 7:54 ` rguenth at gcc dot gnu.org 2012-08-13 18:04 ` aaw at gcc dot gnu.org ` (6 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: rguenth at gcc dot gnu.org @ 2012-08-08 7:54 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 Richard Guenther <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target Milestone|--- |4.7.2 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com 2012-08-07 19:56 ` [Bug c++/54197] " hjl.tools at gmail dot com 2012-08-08 7:54 ` rguenth at gcc dot gnu.org @ 2012-08-13 18:04 ` aaw at gcc dot gnu.org 2012-08-13 18:37 ` redi at gcc dot gnu.org ` (5 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: aaw at gcc dot gnu.org @ 2012-08-13 18:04 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 Ollie Wild <aaw at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |aaw at gcc dot gnu.org AssignedTo|unassigned at gcc dot |aaw at gcc dot gnu.org |gnu.org | --- Comment #2 from Ollie Wild <aaw at gcc dot gnu.org> 2012-08-13 18:04:21 UTC --- The issue is that these cause a COMPOUND_EXPR to be passed to extend_ref_init_temps_1. I have a patch which replaces the second operand of the COMPOUND_EXPR with another call to extend_ref_init_temps_1. Testing now. Will send out for review shortly. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com ` (2 preceding siblings ...) 2012-08-13 18:04 ` aaw at gcc dot gnu.org @ 2012-08-13 18:37 ` redi at gcc dot gnu.org 2012-08-16 18:44 ` aaw at gcc dot gnu.org ` (4 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: redi at gcc dot gnu.org @ 2012-08-13 18:37 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 Jonathan Wakely <redi at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |ASSIGNED ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com ` (3 preceding siblings ...) 2012-08-13 18:37 ` redi at gcc dot gnu.org @ 2012-08-16 18:44 ` aaw at gcc dot gnu.org 2012-08-16 18:47 ` aaw at gcc dot gnu.org ` (3 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: aaw at gcc dot gnu.org @ 2012-08-16 18:44 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 --- Comment #3 from Ollie Wild <aaw at gcc dot gnu.org> 2012-08-16 18:44:01 UTC --- Author: aaw Date: Thu Aug 16 18:43:52 2012 New Revision: 190450 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=190450 Log: Fix some cases where lifetimes of temporaries bound to expressions are not properly extended (Google ref b/6946758). 2012-08-16 Ollie Wild <aaw@google.com> PR c++/54197 * gcc/cp/call.c (extend_ref_init_temps_1): Handle COMPOUND_EXPR trees. * gcc/testsuite/g++.dg/init/lifetime3.C: New test. Added: branches/google/gcc-4_7/gcc/testsuite/g++.dg/init/lifetime3.C Modified: branches/google/gcc-4_7/gcc/cp/ChangeLog.google-4_7 branches/google/gcc-4_7/gcc/cp/call.c branches/google/gcc-4_7/gcc/testsuite/ChangeLog.google-4_7 ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com ` (4 preceding siblings ...) 2012-08-16 18:44 ` aaw at gcc dot gnu.org @ 2012-08-16 18:47 ` aaw at gcc dot gnu.org 2012-08-31 15:48 ` aaw at gcc dot gnu.org ` (2 subsequent siblings) 8 siblings, 0 replies; 10+ messages in thread From: aaw at gcc dot gnu.org @ 2012-08-16 18:47 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 --- Comment #4 from Ollie Wild <aaw at gcc dot gnu.org> 2012-08-16 18:46:42 UTC --- Fix submitted to the google/gcc-4_7 branch. Still waiting on maintainer approval for the trunk and gcc-4_7-branches. ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com ` (5 preceding siblings ...) 2012-08-16 18:47 ` aaw at gcc dot gnu.org @ 2012-08-31 15:48 ` aaw at gcc dot gnu.org 2012-08-31 17:17 ` aaw at gcc dot gnu.org 2012-08-31 17:24 ` aaw at gcc dot gnu.org 8 siblings, 0 replies; 10+ messages in thread From: aaw at gcc dot gnu.org @ 2012-08-31 15:48 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 --- Comment #5 from Ollie Wild <aaw at gcc dot gnu.org> 2012-08-31 15:47:37 UTC --- Author: aaw Date: Fri Aug 31 15:47:29 2012 New Revision: 190834 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=190834 Log: 2012-08-31 Ollie Wild <aaw@google.com> PR c++/54197 * gcc/cp/call.c (extend_ref_init_temps_1): Handle COMPOUND_EXPR trees. * gcc/testsuite/g++.dg/init/lifetime3.C: New test. Added: trunk/gcc/testsuite/g++.dg/init/lifetime3.C Modified: trunk/gcc/cp/ChangeLog trunk/gcc/cp/call.c trunk/gcc/testsuite/ChangeLog ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com ` (6 preceding siblings ...) 2012-08-31 15:48 ` aaw at gcc dot gnu.org @ 2012-08-31 17:17 ` aaw at gcc dot gnu.org 2012-08-31 17:24 ` aaw at gcc dot gnu.org 8 siblings, 0 replies; 10+ messages in thread From: aaw at gcc dot gnu.org @ 2012-08-31 17:17 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 --- Comment #6 from Ollie Wild <aaw at gcc dot gnu.org> 2012-08-31 17:16:47 UTC --- Author: aaw Date: Fri Aug 31 17:16:39 2012 New Revision: 190839 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=190839 Log: Backport from mainline 2012-08-31 Ollie Wild <aaw@google.com> PR c++/54197 * gcc/cp/call.c (extend_ref_init_temps_1): Handle COMPOUND_EXPR trees. * gcc/testsuite/g++.dg/init/lifetime3.C: New test. Added: branches/gcc-4_7-branch/gcc/testsuite/g++.dg/init/lifetime3.C Modified: branches/gcc-4_7-branch/gcc/cp/ChangeLog branches/gcc-4_7-branch/gcc/cp/call.c branches/gcc-4_7-branch/gcc/testsuite/ChangeLog ^ permalink raw reply [flat|nested] 10+ messages in thread
* [Bug c++/54197] [4.7/4.8 regression] Lifetime of reference not properly extended 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com ` (7 preceding siblings ...) 2012-08-31 17:17 ` aaw at gcc dot gnu.org @ 2012-08-31 17:24 ` aaw at gcc dot gnu.org 8 siblings, 0 replies; 10+ messages in thread From: aaw at gcc dot gnu.org @ 2012-08-31 17:24 UTC (permalink / raw) To: gcc-bugs http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54197 Ollie Wild <aaw at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|ASSIGNED |RESOLVED Resolution| |FIXED --- Comment #7 from Ollie Wild <aaw at gcc dot gnu.org> 2012-08-31 17:24:07 UTC --- Fixed for 4.7.2+. ^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2012-08-31 17:24 UTC | newest] Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2012-08-07 18:54 [Bug c++/54197] New: [4.7/4.8 regression] Lifetime of reference not properly extended ppluzhnikov at google dot com 2012-08-07 19:56 ` [Bug c++/54197] " hjl.tools at gmail dot com 2012-08-08 7:54 ` rguenth at gcc dot gnu.org 2012-08-13 18:04 ` aaw at gcc dot gnu.org 2012-08-13 18:37 ` redi at gcc dot gnu.org 2012-08-16 18:44 ` aaw at gcc dot gnu.org 2012-08-16 18:47 ` aaw at gcc dot gnu.org 2012-08-31 15:48 ` aaw at gcc dot gnu.org 2012-08-31 17:17 ` aaw at gcc dot gnu.org 2012-08-31 17:24 ` aaw at gcc dot gnu.org
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).