* use domem() for heap checking

This commit is contained in:
peter 2004-11-26 21:59:49 +00:00
parent e92f1a2d0b
commit d30f99c17e
13 changed files with 100 additions and 99 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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.

View File

@ -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;

View File

@ -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. *)

View File

@ -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');

View File

@ -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');

View File

@ -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);

View File

@ -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.

View File

@ -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);

View File

@ -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;

View File

@ -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.

View File

@ -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);