[fpc-devel] Bug 4004

Gerhard Scholz gs at g--s.de
Mon Jun 6 12:37:47 CEST 2005


The check for overflow is obviously implemented different in 2.0.0 and 2.1.1

This is the line
    d := Ord(a)-Ord(b)
in the function, translation result to assembler:

with 2.0.0 (win32):

.Ll2:
    .stabn 68,0,6,.Ll2 - P$TORD_D$CHAR$CHAR$$SMALLINT
# [6] d := Ord(a)-Ord(b);
     movzbl -4(%ebp),%edx
     movzbl -8(%ebp),%eax
     subl %eax,%edx
     jno .L8
     call FPC_OVERFLOW
.L8:
     movl %edx,%eax
     subl $-32768,%eax
     cmpl $65535,%eax
     jbe .L9
     call FPC_RANGEERROR
.L9:
     movw %dx,-12(%ebp)
.Ll3:

with 2.1.1 (win32):

.Ll2:
     .stabn 68,0,6,.Ll2 - P$TORD_D$CHAR$CHAR$$SMALLINT
# [6] d := Ord(a)-Ord(b);
     movzbl -4(%ebp),%edx
     movzbl -8(%ebp),%eax
     subl %eax,%edx
     jae .L8
     call FPC_OVERFLOW
.L8:
     movl %edx,%eax
     cmpl $32767,%eax
     jbe .L9
     call FPC_RANGEERROR
.L9:
     movw %dx,-12(%ebp)
.Ll3:

A solution would be to replace that line by:
    d := integer(Ord(a))-Ord(b)

It seems that the compiler now sees a "ord(c)" to be a BYTE, and BYTE - BYTE
shall give a BYTE, and -1 is not in the range allowed for a BYTE.

The line " i := Ord('0')-Ord('1') " in the main program is not interesting,
since it contains a constant expression and is converted to " i := -1 " by
the compiler.

Greetings

gs

----- Original Message -----
From: "Colin Western" <mftq75 at dsl.pipex.com>
To: "FPC developers' list" <fpc-devel at lists.freepascal.org>
Sent: Saturday, June 04, 2005 1:38 PM
Subject: [fpc-devel] Bug 4004


> Can I ask somebody to have another look at this bug - it was flagged
> unreproducable on the web system, but I still get it from the current
> svn as shown below.
> (Note that the orginal report was on ppc but I have the same fault on
i386)
> Colin
>
> $ fpc ord.pas
> Free Pascal Compiler version 2.1.1 [2005/06/04] for i386
> Copyright (c) 1993-2005 by Florian Klaempfl
> Target OS: Linux for i386
> Compiling ord.pas
> Linking ord
> 13 Lines compiled, 0.0 sec
> $ ./ord
> -1
> Runtime error 215 at $080480C5
>   $080480C5
>   $0804813A
>
> $ more ord.pas
> {$R+}{$Q+}
> function d(a,b:Char):Integer;
> begin
>   d := Ord(a)-Ord(b);
> end;
>
> var
>   i: Integer;
> begin
>   i := Ord('0')-Ord('1');
>   WriteLn(i);
>   WriteLn(d('0','1'));
> end.
>
>
> _______________________________________________
> fpc-devel maillist  -  fpc-devel at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-devel
>






More information about the fpc-devel mailing list