[fpc-devel] Bug with R-

Markus Kämmerer mk at happyarts.de
Thu Nov 3 11:50:06 CET 2005


as you know we use FreePascal with our OpenXP Project
(www.openxp.de/.com). We found, that after compiling our release
version, an important function doesn't work anymore. After long search,
I found, that compiling with R- instead of R+ is the reason. There is a
bug in fpc. See the following code:

compiled with R+

# [904] zlen:=FindUmbruch(cont[offset],zlen);    { in EDITOR.ASM }
	movl	-20(%ebp),%edx
	movl	%ebx,%eax
	movzwl	-8(%ebp),%esi
> >	movl	%esi,%ecx
	cmpl	$65500,%ecx
	jbe	.Lj1668
	leal	16(%eax,%esi,1),%eax

compiled with R-

# [904] zlen:=FindUmbruch(cont[offset],zlen);    { in EDITOR.ASM }
	movl	-20(%ebp),%edx
	movl	%ebx,%eax
	movzwl	-8(%ebp),%ecx
	leal	16(%eax,%ecx,1),%eax

start of FindUmbruch:

	.stabs "DATA:rv35",64,0,254,0
	.stabs "ZLEN:rp6",64,0,254,2
# Temps allocated between ebp-4 and ebp-4
	.stabs "editor.pas",132,0,0,.Lf2
	.stabn 68,0,306,.Ll48 - EDITOR_FINDUMBRUCH$formal$LONGINT$$LONGINT
	pushl	%ebp
	movl	%esp,%ebp
	subl	$4,%esp
# Var data located in register
# Var zlen located in register
# Var $result located at ebp-4
	.stabn 68,0,257,.Ll49 - EDITOR_FINDUMBRUCH$formal$LONGINT$$LONGINT
# [257] mov   esi,data
	movl	%eax,%esi
	.stabn 68,0,258,.Ll50 - EDITOR_FINDUMBRUCH$formal$LONGINT$$LONGINT
# [258] mov   ebx,zlen
	movl	%edx,%ebx
	.stabn 68,0,259,.Ll51 - EDITOR_FINDUMBRUCH$formal$LONGINT$$LONGINT

Findumbruch awaits the "data" in esi. With the R+ version, the value is
loaded to esi before range check. In the R- version the value is located
in ecx and not been copied to esi, which is the bug.

You may test this bug with the openxp source
(ftp://www.openxp.de/openxp/openxp-4.0.7144.src.tar.bz2), file is
editor.pas. R- can be changed in xpdefine.pas. Source compiled with -O1

If you need more information, I'll do as much as I can.

P.S. Pascal snippet of FindUmbruch

unction FindUmbruch(var data; zlen:integer):integer; assembler; {&uses
ebx, esi}
  { rckw„rts von data[zlen] bis data[0] nach erster Umbruchstelle suchen }
            mov   esi,data
            mov   ebx,zlen
            test  ebx, ebx
            jz    @ufound
            mov   al,[esi+ebx]
            cmp   al,' '               { ' ' -> unbedingter Umbruch }
            jz    @ufound

            cmp   al,'-'               { '-' -> Umbruch, falls alphanum. }
            jnz   @testslash           {        Zeichen folgt: }
            mov   al,[esi+ebx+1]
            cmp   al,'0'               { '0'..'9' }
            jb    @fnext
            cmp   al,'9'
            jbe   @ufound
            cmp   al,'A'               { 'A'..'Z' }
            jb    @fnext
            cmp   al,'Z'
            jbe   @ufound
            cmp   al,'a'               { 'a'..'z' }
            jb    @fnext
            cmp   al,'z'
            jbe   @ufound
            cmp   al,'€'               { '€'..'¥' }
            jb    @fnext
            cmp   al,'¥'
            jbe   @ufound
            jmp   @fnext

            cmp   ebx,1
            ja    @testslash2
            mov   ebx,0
            jmp   @ufound
            cmp   al,'/'               { '/' -> Umbruch, falls kein }
            jnz   @fnext               {        Trennzeichen vorausgeht }
            cmp   byte ptr [esi+ebx-1],' '
            jz    @fnext
            cmp   byte ptr [esi+ebx-1],'-'
            jnz   @ufound

            dec   ebx
            jnz   @floop
            mov   eax,ebx
end ['EAX', 'EBX', 'ESI'];
{$ELSE }

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 187 bytes
Desc: OpenPGP digital signature
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20051103/8e793b11/attachment.sig>

More information about the fpc-devel mailing list