Bug#135727: buffer overflow (?) in writeln
Package: gpc
Version: 2:2.95.4-9
When I print floating-point numbers, I sometimes get garbage like this:
-:.00000000000000/+)))./(/0,,.0.-.0/,.-(e-15
Compile and run like this:
gpc -O2 -g3 -Wall g2.p && ./a.out
The problem seems to be caused by this:
w := 44;
p := 0;
writeln('''', -0.0001e-10:w, '''');
writeln('''', -0.0001e-10:w:p, '''');
writeln('''', 0.0001e-10:w, '''');
writeln('''', 0.0001e-10:w:p, '''');
Feel free to include any of this code (above and/or below) in the
gpc test suite. You can have it under the 2-clause BSD license.
I have a 32-bit big-endian processor, the MPC7400 v2.9 (ppc "G4").
BTW, the assembly output for this code appears to be terribly
inefficient. (only a minute of study though) Floating-point constants
seem to get loaded multiple times instead of being kept in registers.
For your wishlist, have -Os turn the code below into a loop over
an array.
@@@@@@@@@@@@@@@@@@@@@@@@@@ TEST CODE @@@@@@@@@@@@@@@@@@@@@@@@@@@@
PROGRAM giga ( input,output ) ;
var w:integer;
p:integer;
begin
w := 44;
p := 0;
writeln('''', 9.999e9, '''');
writeln('''', 9.999e9:w, '''');
writeln('''', 9.999e9:w:p, '''');
writeln('''', 7.777e9:w:p, '''');
writeln('''', 9.999e-10, '''');
writeln('''', 9.999e-10:w, '''');
writeln('''', 9.999e-10:w:p, '''');
writeln('''', 7.777e-10:w:p, '''');
writeln('''', 123.456, '''');
writeln('''', 123.456:w, '''');
writeln('''', 123.456:w:p, '''');
writeln('''', 0.0001e-9, '''');
writeln('''', 0.0001e-9:w, '''');
writeln('''', 0.0001e-9:w:p, '''');
writeln('''', 0.0001e-10, '''');
writeln('''', 0.0001e-10:w, '''');
writeln('''', 0.0001e-10:w:p, '''');
writeln('''', -9.999e9, '''');
writeln('''', -9.999e9:w, '''');
writeln('''', -9.999e9:w:p, '''');
writeln('''', -7.777e9:w:p, '''');
writeln('''', -9.999e-10, '''');
writeln('''', -9.999e-10:w, '''');
writeln('''', -9.999e-10:w:p, '''');
writeln('''', -7.777e-10:w:p, '''');
writeln('''', -123.456, '''');
writeln('''', -123.456:w, '''');
writeln('''', -123.456:w:p, '''');
writeln('''', -0.0001e-9, '''');
writeln('''', -0.0001e-9:w, '''');
writeln('''', -0.0001e-9:w:p, '''');
writeln('''', -0.0001e-10, '''');
writeln('''', -0.0001e-10:w, '''');
writeln('''', -0.0001e-10:w:p, '''');
writeln('''', -0.0/0.0:w:p, '''');
writeln('''', 0.0/0.0:w:p, '''');
writeln('''', -1.0/0.0:w:p, '''');
writeln('''', 1.0/0.0:w:p, '''');
writeln('''', -0.0/1.0:w:p, '''');
writeln('''', 0.0/1.0:w:p, '''');
writeln('''', -1.0/1.0:w:p, '''');
writeln('''', 1.0/1.0:w:p, '''');
writeln('''', -0.0/-0.0:w:p, '''');
writeln('''', 0.0/-0.0:w:p, '''');
writeln('''', -1.0/-0.0:w:p, '''');
writeln('''', 1.0/-0.0:w:p, '''');
writeln('''', -0.0/-1.0:w:p, '''');
writeln('''', 0.0/-1.0:w:p, '''');
writeln('''', -1.0/-1.0:w:p, '''');
writeln('''', 1.0/-1.0:w:p, '''');
writeln
end.
@@@@@@@@@@@@@@@@@@@@@@@@@@ VERSION INFO @@@@@@@@@@@@@@@@@@@@@@@@@@@@
||/ Name Version Description
+++-==============-==============-============================================
ii gpc 2.95.4-9 The GNU Pascal compiler.
ii libc6 2.2.4-7 GNU C Library: Shared libraries and Timezone
ii gcc 2.95.4-9 The GNU C compiler.
ii cpp 2.95.4-9 The GNU C preprocessor.
ii gpc-2.95 2.95.4-0.01100 The GNU Pascal compiler.
ii gcc-2.95 2.95.4-0.01100 The GNU C compiler.
Package: gpc
Source: gcc-defaults (0.16)
Version: 2:2.95.4-9
Package: libc6
Source: glibc
Version: 2.2.4-7
Package: gcc
Source: gcc-defaults (0.16)
Version: 2:2.95.4-9
Package: cpp
Source: gcc-defaults (0.16)
Version: 2:2.95.4-9
Package: gpc-2.95
Source: gcc-2.95 (2.95.4.ds6-0.011006)
Version: 1:2.95.4-0.011006
Package: gcc-2.95
Source: gcc-2.95 (2.95.4.ds6-0.011006)
Version: 1:2.95.4-0.011006
Reply to: