[lazarus] Nasty compiler bug ???
Marc Weustink
marc at dommelstein.net
Sun Jan 7 19:27:11 EST 2001
Hi,
While debugging the recent problems I found somthing wierd. The
Segmentation fouls in Lazarus is generated in the following piece of code:
procedure SelectGDKPenProps(const DC: HDC);
begin
with PDeviceContext(DC)^, CurrentPen^ do
begin
gdk_gc_set_foreground(GC, @GDIPenColor);
.
.
.
If you look at the disassembly you notice that about 1.9 GB of stack is
used for local vars
0x8074950 <SELECTGDKPENPROPS>: push %ebp
0x8074951 <SELECTGDKPENPROPS+1>: mov %esp,%ebp
0x8074953 <SELECTGDKPENPROPS+3>: sub $0x72f7000c,%esp
^^^^^^^^^^^^^^^^
A bit to much I quess to hold with1 and with2
0x8074959 <SELECTGDKPENPROPS+9>: mov 0x8(%ebp),%eax
0x807495c <SELECTGDKPENPROPS+12>: mov %eax,0xfffffffc(%ebp)
0x807495f <SELECTGDKPENPROPS+15>: mov 0xfffffffc(%ebp),%eax
0x8074962 <SELECTGDKPENPROPS+18>: mov 0x1c(%eax),%eax
0x8074965 <SELECTGDKPENPROPS+21>: mov %eax,0xfffffff8(%ebp)
0x8074968 <SELECTGDKPENPROPS+24>: mov 0xfffffff8(%ebp),%eax
0x807496b <SELECTGDKPENPROPS+27>: lea 0x4(%eax),%eax
0x807496e <SELECTGDKPENPROPS+30>: push %eax
^^^^^^^^^^^^^
Causes segfault since stack is invalid.
0x807496f <SELECTGDKPENPROPS+31>: mov 0xfffffffc(%ebp),%eax
0x8074972 <SELECTGDKPENPROPS+34>: pushl 0x4(%eax)
0x8074975 <SELECTGDKPENPROPS+37>: call 0x804e484 <gdk_gc_set_foreground>
To check if this was compiler related I put all needed structs in one
program, called the same piece of code and this version disassembed to:
0x80542f0 <SELECTGDKPENPROPS>: push %ebp
0x80542f1 <SELECTGDKPENPROPS+1>: mov %esp,%ebp
0x80542f3 <SELECTGDKPENPROPS+3>: sub $0x8,%esp
^^^^^^^^^
Seems reasonable hold with1 and with2
0x80542f6 <SELECTGDKPENPROPS+6>: mov 0x8(%ebp),%eax
0x80542f9 <SELECTGDKPENPROPS+9>: mov %eax,0xfffffffc(%ebp)
0x80542fc <SELECTGDKPENPROPS+12>: mov 0xfffffffc(%ebp),%eax
0x80542ff <SELECTGDKPENPROPS+15>: mov 0x1c(%eax),%eax
0x8054302 <SELECTGDKPENPROPS+18>: mov %eax,0xfffffff8(%ebp)
0x8054305 <SELECTGDKPENPROPS+21>: mov 0xfffffff8(%ebp),%eax
0x8054308 <SELECTGDKPENPROPS+24>: lea 0x4(%eax),%eax
0x805430b <SELECTGDKPENPROPS+27>: push %eax
0x805430c <SELECTGDKPENPROPS+28>: mov 0xfffffffc(%ebp),%eax
0x805430f <SELECTGDKPENPROPS+31>: pushl 0x4(%eax)
0x8054312 <SELECTGDKPENPROPS+34>: call 0x8048af8 <gdk_gc_set_foreground>
And that was something you would expect. So my question... what to do about it.
Marc
More information about the Lazarus
mailing list