mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-23 18:50:09 +01:00
* use domem() for heap checking
This commit is contained in:
parent
e92f1a2d0b
commit
d30f99c17e
@ -3,9 +3,14 @@
|
|||||||
|
|
||||||
{$H+}
|
{$H+}
|
||||||
Program AnsiTest;
|
Program AnsiTest;
|
||||||
|
uses
|
||||||
|
erroru;
|
||||||
|
|
||||||
Type
|
Type
|
||||||
PS=^String;
|
PS=^String;
|
||||||
|
var
|
||||||
|
mem : ptrint;
|
||||||
|
|
||||||
|
|
||||||
procedure test;
|
procedure test;
|
||||||
var
|
var
|
||||||
@ -26,18 +31,10 @@ Begin
|
|||||||
Dispose(P);
|
Dispose(P);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
|
||||||
membefore : longint;
|
|
||||||
|
|
||||||
begin
|
begin
|
||||||
membefore:=memavail;
|
DoMem(mem);
|
||||||
test;
|
test;
|
||||||
if membefore<>memavail then
|
if DoMem(mem)<>0 then
|
||||||
begin
|
halt(1);
|
||||||
Writeln('Memory hole using pointers to ansi strings');
|
|
||||||
Halt(1);
|
|
||||||
end
|
|
||||||
else
|
|
||||||
Writeln('No memory hole with pointers to ansi strings');
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
{ Old file: tbs0280.pp }
|
{ Old file: tbs0280.pp }
|
||||||
{ problem with object finalization. OK 0.99.13 (FK) }
|
{ problem with object finalization. OK 0.99.13 (FK) }
|
||||||
|
|
||||||
{$mode objfpc}
|
{$mode objfpc}
|
||||||
{$H+}
|
{$H+}
|
||||||
|
|
||||||
program memhole;
|
uses
|
||||||
|
Erroru;
|
||||||
|
|
||||||
type
|
type
|
||||||
TMyClass = class
|
TMyClass = class
|
||||||
@ -29,17 +29,10 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
membefore : sizeint;
|
mem : sizeint;
|
||||||
begin
|
begin
|
||||||
membefore:=memavail;
|
DoMem(mem);
|
||||||
writeln(memavail);
|
|
||||||
dotest;
|
dotest;
|
||||||
writeln(memavail);
|
if DoMem(mem)<>0 then
|
||||||
if membefore<>memavail then
|
|
||||||
begin
|
|
||||||
Writeln('Memory hole using ansi strings in classes');
|
|
||||||
Halt(1);
|
Halt(1);
|
||||||
end
|
|
||||||
else
|
|
||||||
Writeln('No memory hole unsing ansi strings in classes');
|
|
||||||
end.
|
end.
|
||||||
|
|||||||
@ -24,7 +24,6 @@ program test_fail;
|
|||||||
var
|
var
|
||||||
pa1, pa2 : parrayobj;
|
pa1, pa2 : parrayobj;
|
||||||
ta1, ta2 : tarrayobj;
|
ta1, ta2 : tarrayobj;
|
||||||
availmem : longint;
|
|
||||||
|
|
||||||
constructor tarrayobj.init(do_fail : boolean);
|
constructor tarrayobj.init(do_fail : boolean);
|
||||||
begin
|
begin
|
||||||
@ -40,8 +39,8 @@ program test_fail;
|
|||||||
|
|
||||||
procedure tarrayobj.test;
|
procedure tarrayobj.test;
|
||||||
begin
|
begin
|
||||||
Writeln('@self = ',longint(@self));
|
Writeln('@self = ',ptrint(@self));
|
||||||
Writeln('typeof = ',longint(typeof(self)));
|
Writeln('typeof = ',ptrint(typeof(self)));
|
||||||
if ar[1]=1 then
|
if ar[1]=1 then
|
||||||
Writeln('Init called');
|
Writeln('Init called');
|
||||||
if ar[2]=2 then
|
if ar[2]=2 then
|
||||||
@ -66,33 +65,33 @@ program test_fail;
|
|||||||
Inherited test;
|
Inherited test;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
var
|
||||||
|
mem : sizeint;
|
||||||
begin
|
begin
|
||||||
|
mem:=0;
|
||||||
|
DoMem(mem);
|
||||||
new(pa1,init(false));
|
new(pa1,init(false));
|
||||||
getheapstatus(hstatus);
|
writeln('After successful new(pa1,init)');
|
||||||
writeln('After successful new(pa1,init), memory used = ',hstatus.CurrHeapUsed);
|
|
||||||
new(pa2,init(true));
|
new(pa2,init(true));
|
||||||
getheapstatus(hstatus);
|
writeln('After unsuccessful new(pa2,init)');
|
||||||
writeln('After unsuccessful new(pa2,init), memory used = ',hstatus.CurrHeapUsed);
|
writeln('pa1 = ',ptrint(pa1),' pa2 = ',ptrint(pa2));
|
||||||
writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
|
|
||||||
writeln('Call to pa1^.test after successful init');
|
writeln('Call to pa1^.test after successful init');
|
||||||
pa1^.test;
|
pa1^.test;
|
||||||
dispose(pa1,done);
|
dispose(pa1,done);
|
||||||
getheapstatus(hstatus);
|
writeln('After release of pa1');
|
||||||
writeln('After release of pa1, memory used = ',hstatus.CurrHeapUsed);
|
DoMem(mem);
|
||||||
pa1:=new(pbigarrayobj,good_init);
|
pa1:=new(pbigarrayobj,good_init);
|
||||||
getheapstatus(hstatus);
|
writeln('After successful pa1:=new(pbigarrayobj,good_init)');
|
||||||
writeln('After successful pa1:=new(pbigarrayobj,good_init), memory used = ',hstatus.CurrHeapUsed);
|
|
||||||
pa2:=new(pbigarrayobj,wrong_init);
|
pa2:=new(pbigarrayobj,wrong_init);
|
||||||
getheapstatus(hstatus);
|
writeln('After unsuccessful pa2:=new(pbigarrayobj,wrong_init)');
|
||||||
writeln('After unsuccessful pa2:=new(pbigarrayobj,wrong_init), memory used = ',hstatus.CurrHeapUsed);
|
writeln('pa1 = ',ptrint(pa1),' pa2 = ',ptrint(pa2));
|
||||||
writeln('pa1 = ',longint(pa1),' pa2 = ',longint(pa2));
|
|
||||||
writeln('Call to pa1^.test after successful init');
|
writeln('Call to pa1^.test after successful init');
|
||||||
pa1^.test;
|
pa1^.test;
|
||||||
ta1.init(false);
|
ta1.init(false);
|
||||||
writeln('Call to ta1.test after successful init');
|
writeln('Call to ta1.test after successful init');
|
||||||
ta1.test;
|
ta1.test;
|
||||||
ta2.init(true);
|
ta2.init(true);
|
||||||
writeln('typeof(ta2) = ',longint(typeof(ta2)),' after unsuccessful init');
|
writeln('typeof(ta2) = ',ptrint(typeof(ta2)),' after unsuccessful init');
|
||||||
Writeln('Trying to call ta2.test (should generate a Run Time Error)');
|
Writeln('Trying to call ta2.test (should generate a Run Time Error)');
|
||||||
ta2.test;
|
ta2.test;
|
||||||
end.
|
end.
|
||||||
|
|||||||
@ -30,7 +30,7 @@ type
|
|||||||
procedure getheapstatus(var status:THeapStatus);
|
procedure getheapstatus(var status:THeapStatus);
|
||||||
{$endif HASGETHEAPSTATUS}
|
{$endif HASGETHEAPSTATUS}
|
||||||
|
|
||||||
Procedure DoMem (Var StartMem : sizeint);
|
function DoMem (Var StartMem : sizeint): sizeint;
|
||||||
|
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -115,13 +115,37 @@ end;
|
|||||||
{$endif HASGETHEAPSTATUS}
|
{$endif HASGETHEAPSTATUS}
|
||||||
|
|
||||||
|
|
||||||
Procedure DoMem (Var StartMem : sizeint);
|
function DoMem (Var StartMem : sizeint): sizeint;
|
||||||
|
|
||||||
|
function getsize(l:sizeint):string;
|
||||||
|
begin
|
||||||
|
if l<16*1024 then
|
||||||
|
begin
|
||||||
|
str(l,getsize);
|
||||||
|
getsize:=getsize+' bytes';
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
str(l shr 10,getsize);
|
||||||
|
getsize:=getsize+' Kb';
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
hstatus : THeapstatus;
|
hstatus : THeapstatus;
|
||||||
begin
|
begin
|
||||||
GetHeapStatus(hstatus);
|
GetHeapStatus(hstatus);
|
||||||
if StartMem<>0 then
|
if StartMem=0 then
|
||||||
Writeln ('Used: ',hstatus.CUrrHeapUsed shr 10,'Kb, Lost ',hstatus.CurrHeapUsed-StartMem,' Bytes.');
|
begin
|
||||||
|
Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),', Used: ',getsize(hstatus.CurrHeapUsed));
|
||||||
|
DoMem:=0;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
Writeln ('[HEAP] Size: ',getsize(hstatus.CurrHeapSize),', Used: ',getsize(hstatus.CurrHeapUsed),
|
||||||
|
', Lost: ',getsize(hstatus.CurrHeapUsed-StartMem));
|
||||||
|
DoMem:=hstatus.CurrHeapUsed-StartMem;
|
||||||
|
end;
|
||||||
StartMem:=hstatus.CurrHeapUsed;
|
StartMem:=hstatus.CurrHeapUsed;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
@ -1,34 +1,22 @@
|
|||||||
{ Program 1 : memory waste
|
{ Program 1 : memory waste
|
||||||
dummy test }
|
dummy test }
|
||||||
|
|
||||||
USES SysUtils;
|
USES SysUtils,erroru;
|
||||||
|
|
||||||
procedure test_it;
|
procedure test_it;
|
||||||
var
|
var
|
||||||
sRec : TSearchRec;
|
sRec : TSearchRec;
|
||||||
begin
|
begin
|
||||||
writeln(memAvail);
|
|
||||||
findFirst('c:\*.*',faVolumeId,sRec);
|
findFirst('c:\*.*',faVolumeId,sRec);
|
||||||
findClose(sRec);
|
findClose(sRec);
|
||||||
writeln(sRec.name);
|
writeln(sRec.name);
|
||||||
writeln(memAvail); { 288 bytes waste ! }
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
begin
|
|
||||||
Writeln('Before call ',MemAvail);
|
|
||||||
test_it;
|
|
||||||
Writeln('After call : ',MemAvail);
|
|
||||||
end.
|
|
||||||
(*{ Program 2 : correct }
|
|
||||||
|
|
||||||
USES Dos;
|
|
||||||
|
|
||||||
var
|
var
|
||||||
sRec : searchRec;
|
mem : sizeint;
|
||||||
begin
|
begin
|
||||||
writeln(memAvail);
|
mem:=0;
|
||||||
findFirst('c:\*.*',volumeid,sRec);
|
DoMem(mem);
|
||||||
findClose(sRec);
|
test_it;
|
||||||
writeln(sRec.name);
|
DoMem(mem);
|
||||||
writeln(memAvail); { no memory waste ! }
|
end.
|
||||||
end. *)
|
|
||||||
@ -1,4 +1,5 @@
|
|||||||
program TestVm2;
|
uses
|
||||||
|
erroru;
|
||||||
|
|
||||||
procedure Test;
|
procedure Test;
|
||||||
var
|
var
|
||||||
@ -9,13 +10,11 @@ begin
|
|||||||
ReAllocMem(P, 0);
|
ReAllocMem(P, 0);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var MemBefore : longint;
|
var Mem : sizeint;
|
||||||
begin
|
begin
|
||||||
writeln(MemAvail);
|
domem(mem);
|
||||||
MemBefore:=MemAvail;
|
|
||||||
Test;
|
Test;
|
||||||
writeln(MemAvail);
|
if domem(mem)<>0 then
|
||||||
if MemBefore<>MemAvail then
|
|
||||||
begin
|
begin
|
||||||
Writeln('ReAllocMem creates emory leaks');
|
Writeln('ReAllocMem creates emory leaks');
|
||||||
Writeln('Bug 812 is not yet fixed');
|
Writeln('Bug 812 is not yet fixed');
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
program TestVm2;
|
uses erroru;
|
||||||
|
|
||||||
procedure Test;
|
procedure Test;
|
||||||
var
|
var
|
||||||
@ -15,13 +15,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
var MemBefore : longint;
|
var Mem : sizeint;
|
||||||
begin
|
begin
|
||||||
writeln(heapsize-MemAvail);
|
domem(mem);
|
||||||
MemBefore:=heapsize-MemAvail;
|
|
||||||
Test;
|
Test;
|
||||||
writeln(heapsize-MemAvail);
|
if domem(mem)<>0 then
|
||||||
if MemBefore<>heapsize-MemAvail then
|
|
||||||
begin
|
begin
|
||||||
Writeln('ReAllocMem creates emory leaks');
|
Writeln('ReAllocMem creates emory leaks');
|
||||||
Writeln('Bug 812 is not yet fixed');
|
Writeln('Bug 812 is not yet fixed');
|
||||||
|
|||||||
@ -4,7 +4,7 @@
|
|||||||
program Buggy;
|
program Buggy;
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
erroru,
|
||||||
Objects, Strings;
|
Objects, Strings;
|
||||||
|
|
||||||
type
|
type
|
||||||
@ -31,10 +31,9 @@ end;
|
|||||||
// Global vars
|
// Global vars
|
||||||
var
|
var
|
||||||
pTempStream: PMyStream;
|
pTempStream: PMyStream;
|
||||||
EntryMem,ExitMem : Cardinal;
|
mem : sizeint;
|
||||||
// Main routine
|
|
||||||
begin
|
begin
|
||||||
EntryMem:=heapsize-MemAvail;
|
DoMem(mem);
|
||||||
pTempStream := nil;
|
pTempStream := nil;
|
||||||
pTempStream := New(PMyStream, Init('tw1658.tmp', stCreate));
|
pTempStream := New(PMyStream, Init('tw1658.tmp', stCreate));
|
||||||
if not Assigned(pTempStream) then
|
if not Assigned(pTempStream) then
|
||||||
@ -42,8 +41,7 @@ begin
|
|||||||
pTempStream^.m_fAutoDelete := False;
|
pTempStream^.m_fAutoDelete := False;
|
||||||
Dispose(pTempStream, Done);
|
Dispose(pTempStream, Done);
|
||||||
pTempStream := nil;
|
pTempStream := nil;
|
||||||
ExitMem:=heapsize-MemAvail;
|
if DoMem(mem)<>0 then
|
||||||
If ExitMem<EntryMem then
|
|
||||||
begin
|
begin
|
||||||
Writeln('Memory lost');
|
Writeln('Memory lost');
|
||||||
Halt(1);
|
Halt(1);
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
{ Source provided for Free Pascal Bug Report 2494 }
|
{ Source provided for Free Pascal Bug Report 2494 }
|
||||||
{ Submitted by "Alan Mead" on 2003-05-17 }
|
{ Submitted by "Alan Mead" on 2003-05-17 }
|
||||||
{ e-mail: cubrewer@yahoo.com }
|
{ e-mail: cubrewer@yahoo.com }
|
||||||
program dummy;
|
uses
|
||||||
|
erroru;
|
||||||
|
|
||||||
type
|
type
|
||||||
matrix_element = array[1..1] of byte;
|
matrix_element = array[1..1] of byte;
|
||||||
@ -17,11 +18,10 @@ var p:pointer;
|
|||||||
size, storage : longint;
|
size, storage : longint;
|
||||||
i,j:longint;
|
i,j:longint;
|
||||||
done:boolean;
|
done:boolean;
|
||||||
|
mem : sizeint;
|
||||||
begin
|
begin
|
||||||
ReturnNilIfGrowHeapFails:=true;
|
ReturnNilIfGrowHeapFails:=true;
|
||||||
writeln('Total heap available is ',MemAvail,' bytes');
|
domem(mem);
|
||||||
writeln('Largest block available is ',MaxAvail,' bytes');
|
|
||||||
done := false;
|
done := false;
|
||||||
size := 40000000;
|
size := 40000000;
|
||||||
repeat
|
repeat
|
||||||
@ -40,5 +40,6 @@ begin
|
|||||||
freemem(l,storage);
|
freemem(l,storage);
|
||||||
end;
|
end;
|
||||||
until (done);
|
until (done);
|
||||||
|
domem(mem);
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@
|
|||||||
{$H+}
|
{$H+}
|
||||||
{ $mode DELPHI}
|
{ $mode DELPHI}
|
||||||
|
|
||||||
uses SysUtils;
|
uses erroru,SysUtils;
|
||||||
|
|
||||||
procedure P;
|
procedure P;
|
||||||
var s:string;
|
var s:string;
|
||||||
@ -18,12 +18,13 @@ procedure p1;
|
|||||||
var
|
var
|
||||||
i : sizeint;
|
i : sizeint;
|
||||||
begin
|
begin
|
||||||
i:=heapsize-memavail;
|
i:=0;
|
||||||
|
domem(i);
|
||||||
try
|
try
|
||||||
P;
|
P;
|
||||||
except
|
except
|
||||||
end;
|
end;
|
||||||
if i<>heapsize-memavail then
|
if domem(i)<>0 then
|
||||||
begin
|
begin
|
||||||
writeln('Memleak');
|
writeln('Memleak');
|
||||||
halt(1);
|
halt(1);
|
||||||
|
|||||||
@ -5,6 +5,7 @@
|
|||||||
{ e-mail: Arnstein.Prytz@jcu.edu.au }
|
{ e-mail: Arnstein.Prytz@jcu.edu.au }
|
||||||
program tmp;
|
program tmp;
|
||||||
|
|
||||||
|
{$goto on}
|
||||||
{$asmmode intel}
|
{$asmmode intel}
|
||||||
|
|
||||||
procedure l;
|
procedure l;
|
||||||
|
|||||||
@ -6,6 +6,7 @@ program project1;
|
|||||||
{$mode objfpc}{$H+}
|
{$mode objfpc}{$H+}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
|
erroru,
|
||||||
Classes;
|
Classes;
|
||||||
|
|
||||||
procedure p1;
|
procedure p1;
|
||||||
@ -19,13 +20,11 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
var
|
var
|
||||||
mem1,mem2 : longint;
|
mem : sizeint;
|
||||||
begin
|
begin
|
||||||
mem1:=heapsize-memavail;
|
domem(mem);
|
||||||
p1;
|
p1;
|
||||||
mem2:=heapsize-memavail;
|
if domem(mem)<>0 then
|
||||||
writeln(mem1,' - ',mem2);
|
|
||||||
if mem1<>mem2 then
|
|
||||||
halt(1);
|
halt(1);
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
|||||||
@ -4,13 +4,16 @@ unit uw0701d;
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
uses erroru;
|
||||||
|
|
||||||
var
|
var
|
||||||
startmem : longint;
|
startmem : sizeint;
|
||||||
|
|
||||||
initialization
|
initialization
|
||||||
startmem:=heapsize-memavail;
|
startmem:=0;
|
||||||
|
DoMem(startmem);
|
||||||
finalization
|
finalization
|
||||||
if startmem<>heapsize-memavail then
|
if DoMem(startmem)<>0 then
|
||||||
begin
|
begin
|
||||||
writeln('Problem with ansistrings in units');
|
writeln('Problem with ansistrings in units');
|
||||||
halt(1);
|
halt(1);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user