Incorrect dereference in argument passage
Arthur Schwarz
aschwarz1309@att.net
Wed Sep 5 21:22:00 GMT 2012
IDE Netbeans 7.2
gcc 4.5.3
gdb 7.3.50.20111026-cvs (cygwin-special)
In the code below setDatumCell is passed X.getOperator() instead of
*X.getOperator(); I am running under gdb and the generated code (from the gdb
disassembler) is included.
Both getData() and getOperator() are inline methods. The fact of an error iin
expanding inline methods was reported previously under "Possible code
generationi bug using virtual destructors" on 31 Aug 2012 16:15:59 -0700 (PDT).
It has not been responded to which (to me) implies no interest and, presumably,
my understanding of the issue is wildly incorrect and that I blundered in my
coding. If this issue has a similar provenance perhaps someone can explain what
I have done wrong. In this case I assume that a dereference means a dereference.
Passing code without a dereference being done seems mildly incorrect. What have
I misunderstood?
I have checked the operation in gdb. X.getOperator() works correctly. At the
source language level *(X.getOperator()) works correctly during Expression
Evaluation in gdb. In setDatum(void* op), op contains the value of
X.getOperator() and not *(X.getOperator()).
Taking the body of the statement and not making it inline corrects the issue, to
wit,
*(X.getOperator() works correctly and the correct value is passed to
setDatumCell(void* op).
It looks as if in some cases using an implicit inline statement (a body and
method definition in the header file) breaks the compiler. if this is accurate
are there any guidelines? Will explicit inlines work correctly (inline <type>
method();) or can inlines not be used?
thanks
art
// statement in header file (SlipDatum.h)
SlipDatum(SlipDatum& X) { *getData() = *getData(X);
setDatumCell(*(X.getOperator())); };
// source code.
getOperator()
// doesn't dereference
correctly
gdb disassembly listing
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+0: push %ebp
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+1: mov %esp,%ebp
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+3: push %ebx
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+4: sub $0x14,%esp
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+7: mov 0x8(%ebp),%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+10: mov %eax,(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+13: call 0x461e30
<slip::SlipCell::SlipCell()>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+18: mov 0x8(%ebp),%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+21: movl $0x474c28,(%eax)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+27: mov 0x8(%ebp),%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+30: mov %eax,(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+33: call 0x460a34
<slip::SlipCellBase::getData()>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+38: mov %eax,%ebx
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+40: mov 0xc(%ebp),%eax
SlipDatum(SlipDatum& X) { *getData() = *getData(X);
setDatumCell(*(X.getOperator())); };
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+43: mov %eax,(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+46: call 0x460a20
<slip::SlipCellBase::getData(slip::SlipCellBase&)>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+51: mov 0x4(%eax),%edx
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+54: mov (%eax),%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+56: mov %eax,(%ebx)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+58: mov %edx,0x4(%ebx)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+61: mov 0xc(%ebp),%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+64: mov %eax,(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+67: call 0x4608a0
<slip::SlipCellBase::getOperator()>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+72: mov %eax,0x4(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+76: mov 0x8(%ebp),%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+79: mov %eax,(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+82: call 0x462164
<slip::SlipDatum::setDatumCell(void*)>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)()
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+87: jmp 0x462334
<slip::SlipDatum::SlipDatum(slip::SlipDatum&)+112>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+89: mov %eax,%ebx
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+91: mov 0x8(%ebp),%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+94: mov %eax,(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+97: call 0x461ea0
<slip::SlipCell::~SlipCell()>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+102: mov %ebx,%eax
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+104: mov %eax,(%esp)
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+107: call 0x45f528
<_Unwind_Resume>
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+112: add $0x14,%esp
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+115: pop %ebx
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+116: pop %ebp
slip::SlipDatum::SlipDatum(slip::SlipDatum&)+117: ret
More information about the Gcc-help
mailing list