* SIGSERV termination on return statement
@ 2012-10-09 21:48 Arthur Schwarz
2012-10-09 23:32 ` Aurelian Melinte
0 siblings, 1 reply; 5+ messages in thread
From: Arthur Schwarz @ 2012-10-09 21:48 UTC (permalink / raw)
To: gdb
Product Version = NetBeans IDE 7.2 (Build 201207171143)
Operating System = Windows 7 version 6.1 running on x86
Java; VM; Vendor = 1.7.0_03
Runtime = Java HotSpot(TM) Client VM 22.1-b02
Cygwin gcc 4.5.3
gdb 4.5.3
I'm debugging my C++ software using Netbeans and gdb 4.5.3 (integrated into the
IDE) and I get a fatal error on the return from a method. The fault is
consistent in that there is a failure in the same place in my code with the same
caller all the time, and inconsistent in that there is no failure under other
conditions. I am perfectly willing to accept the fault as mine but I can't seem
to find the fault with gdb (and, hence, unable to fix it).
The circumstances are:
when I have 'a = method()' with '=' overloaded there is always a failure on
the method return.
when I have 'method()' with no assignment there is no failure.
I have set a breakpoint in the overloaded assignment code but the breakpoint is
never executed (?).
The code is shown below (as an aid?). Any idea how I can use gdb to isolate the
point of failure? As a note, the overload architecture looks like:
class SlipCell {
virtual SlipCell& operator=(SlipCell& X) = 0;
}
class SlipDatum: public SlipCell {
virtual SlipCell& operator=(SlipCell& X); // code in .cpp file
}
class SlipHeader: public SlipCell {
virtual SlipCell^ operator=(SlipCell& X); // code in .cpp file
}
class SlipSublist: public SlipCell {
virtual SlipCell& operator=(SlipCell& X); // code in .cpp file
}
The code where the failure occurs is:
[code]
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)
SlipCell& SlipSublist::assignData(SlipCell& X) { // Assign a
sublist to the current cell
SlipCell* cell = this;
if (isTemp()) {
postError(SlipErr::E2036, "replace", "", "", this, &X);
} else {
if (X.isData()) {
cell = &X;
if (X.isTemp()) {
cell = new SlipDatum((SlipDatum&)X);
} else if (!X.isUnlinked()) {
postError(SlipErr::E2039, "replace", "", "", this, &X);
return *this;
}
replaceLinks(*cell);
} else {
SlipHeader* header = &(SlipHeader&)X;
SlipHeader* oldHeader = (SlipHeader*)*getSublistHeader();
if (X.isSublist()) {
header = (SlipHeader*)*getSublistHeader(X);
} else if (!X.isHeader()) {
postError(SlipErr::E3020, "replace", "", " Must be a Header,
Sublist or Datum", this);
return *cell;
}
*getSublistHeader() = header;
(*getHeadRefCnt(*header))++;
delete oldHeader;
}
}
return *cell; //failure seems to be after the return statement is
executed and before the return
//to the caller and the overloaded '=' operator is never
entered.
}; // SlipCell& SlipSublist::assignData(SlipCell& X)
[/code]
I can't debug without a debugger. It would be useful to know that this is my
error (I have misunderstood C++) or whether it is a debugger issue. And I would
really like to know how to bypass any fault in the debugger (if there is one).
This problem has dogged me for the last month or so - I have worked around it in
most cases but now it's time to stop the bleeding.
thanks
PS: If my syntax is garbled or the presentation poor please provide guidance and
not condemnation.
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: SIGSERV termination on return statement
2012-10-09 21:48 SIGSERV termination on return statement Arthur Schwarz
@ 2012-10-09 23:32 ` Aurelian Melinte
2012-10-10 16:01 ` Arthur Schwarz
0 siblings, 1 reply; 5+ messages in thread
From: Aurelian Melinte @ 2012-10-09 23:32 UTC (permalink / raw)
To: Arthur Schwarz; +Cc: gdb
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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: SIGSERV termination on return statement
2012-10-09 23:32 ` Aurelian Melinte
@ 2012-10-10 16:01 ` Arthur Schwarz
2012-10-11 0:27 ` Aurelian Melinte
0 siblings, 1 reply; 5+ messages in thread
From: Arthur Schwarz @ 2012-10-10 16:01 UTC (permalink / raw)
To: Aurelian Melinte; +Cc: gdb
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
----- 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
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: SIGSERV termination on return statement
2012-10-10 16:01 ` Arthur Schwarz
@ 2012-10-11 0:27 ` Aurelian Melinte
2012-10-11 9:40 ` John Gilmore
0 siblings, 1 reply; 5+ messages in thread
From: Aurelian Melinte @ 2012-10-11 0:27 UTC (permalink / raw)
To: gdb
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
>
>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: SIGSERV termination on return statement
2012-10-11 0:27 ` Aurelian Melinte
@ 2012-10-11 9:40 ` John Gilmore
0 siblings, 0 replies; 5+ messages in thread
From: John Gilmore @ 2012-10-11 9:40 UTC (permalink / raw)
To: Arthur Schwarz, gdb
It's not clear whether Mr. Schwarz is reporting that his user-program
crashed with SIGSEGV, or whether he's reporting that GDB crashed
with SIGSEGV while debugging his program. Or both? Please clarify.
Clearly GDB should never be crashing, no matter how badly behaved
the user program or compiler may be.
John
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2012-10-11 9:40 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-09 21:48 SIGSERV termination on return statement Arthur Schwarz
2012-10-09 23:32 ` Aurelian Melinte
2012-10-10 16:01 ` Arthur Schwarz
2012-10-11 0:27 ` Aurelian Melinte
2012-10-11 9:40 ` John Gilmore
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).