Incorrect dereference in argument passage

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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    


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux