From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3195 invoked by alias); 11 Oct 2012 00:27:19 -0000 Received: (qmail 3179 invoked by uid 22791); 11 Oct 2012 00:27:19 -0000 X-SWARE-Spam-Status: No, hits=-3.0 required=5.0 tests=AWL,BAYES_00,FREEMAIL_ENVFROM_END_DIGIT,FREEMAIL_FROM,KHOP_RCVD_UNTRUST,KHOP_THREADED,RCVD_IN_DNSWL_NONE,RCVD_IN_HOSTKARMA_NO,RCVD_IN_HOSTKARMA_W,RCVD_IN_HOSTKARMA_WL,RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mailout-de.gmx.net (HELO mailout-de.gmx.net) (213.165.64.23) by sourceware.org (qpsmtpd/0.43rc1) with SMTP; Thu, 11 Oct 2012 00:27:14 +0000 Received: (qmail invoked by alias); 11 Oct 2012 00:27:12 -0000 Received: from 174-138-223-3.cpe.distributel.net (EHLO [192.168.100.3]) [174.138.223.3] by mail.gmx.net (mp039) with SMTP; 11 Oct 2012 02:27:12 +0200 Message-ID: <5076125E.3060207@gmx.net> Date: Thu, 11 Oct 2012 00:27:00 -0000 From: Aurelian Melinte User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.9) Gecko/20100722 Eudora/3.0.4 MIME-Version: 1.0 To: gdb@sourceware.org Subject: Re: SIGSERV termination on return statement References: <1349819318.23713.YahooMailRC@web181302.mail.ne1.yahoo.com> <5074B404.9090402@gmx.net> <1349884852.11402.YahooMailRC@web181302.mail.ne1.yahoo.com> In-Reply-To: <1349884852.11402.YahooMailRC@web181302.mail.ne1.yahoo.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2012-10/txt/msg00054.txt.bz2 On 10/10/2012 12:00 PM, Arthur Schwarz wrote: > The object is deleted and not used within this context. The error occurs before > the assignment is complete. > > I might have a (very strong) misunderstanding of how C++ references work, but, > I don't think that gdb should just quit and not allow me to debug. > > > In SlipSublist::replace if 'SlipCell& cell' is changed to 'SlipCell* cell', > with appropriate changes to the remaining code, then no error occurs. It is > only when a reference is used do I get into difficulty. I get a SIGSERV error > from gdb in this context and in others when an assignment is made to a > reference variable, 'cell' in this case. Whenever 'variable = somereference' is > executed, gdb faults. 'somereference' can be a function or a variable. > > The questions I have are (1) can reference variables not be reassigned?, and (2) > is gdb's SIGSERV fault a legitimate fault or a bug? > > Thanks for taking the time; > art > Well... A C++ reference has different semantics than a Java reference (and my Java is rusty). Under the hood (I mean what the compiler uses when dealing with a reference) a reference is a pointer. But at the surface where the programmer is, a reference will not allow you certain types of operations permitted on pointers, in particular, you can only initialize a reference; but you cannot re-assign it. I do not have the patience to get through the standardese but check this: http://en.wikipedia.org/wiki/Reference_%28C%2B%2B%29: "Once a reference is created, it cannot be later made to reference another object; it cannot be /reseated/. This is often done with pointers." Which is why this code makes me think of a compiler bug and I suspect that assignment is simply dropped and cell still points to the deleted *this: SlipCell& cell = *this; // Ref initialization cell = assignData(X); // Ref re-assignment verboten. Compiler should have croaked. You can check with the debugger where that cell ref points before and after the re-assignment in the delete case but before returning from replace(). Regards, Aurelian > > > ----- Original Message ---- > From: Aurelian Melinte > To: Arthur Schwarz > Cc:gdb@sourceware.org > Sent: Tue, October 9, 2012 4:32:20 PM > Subject: Re: SIGSERV termination on return statement > > On 09/10/2012 5:48 PM, Arthur Schwarz wrote: > >> SlipCell& SlipSublist::replace(SlipCell& X) { // Replace a >> cell >> on a list with a new cell >> SlipCell& cell = *this; >> if (X.isData()) { >> cell = assignData(X); // failure before return to this statement >> > from > >> method >> *** delete this; >> } else { >> *this = X; >> } >> *** return cell; >> }; // SlipCell& SlipSublist::replace(SlipCell& X) >> >> > Are you returning from a deleted object then using it afterward? > > Regards, > Aurelian > >