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

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: