This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: SIGSERV termination on return statement


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<ame01@gmx.net>
To: Arthur Schwarz<aschwarz1309@att.net>
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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]