mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-12 01:30:28 +02:00
85 lines
1.5 KiB
ObjectPascal
85 lines
1.5 KiB
ObjectPascal
{$ifdef linux}
|
|
uses
|
|
baseunix;
|
|
{$endif linux}
|
|
|
|
{$ifdef CPUAVR}
|
|
{ avr does not support an exitproc }
|
|
begin
|
|
end.
|
|
{$else CPUAVR}
|
|
{$S+}
|
|
|
|
{ Program to check that an infinite recursion
|
|
does generate a RTE ... }
|
|
|
|
{$R-}
|
|
{ make that recursion really infinite
|
|
needs that range check is disabled }
|
|
|
|
const
|
|
level : longint = 0;
|
|
|
|
function inf_rec(x : longint) : longint;
|
|
|
|
begin
|
|
inc(level);
|
|
inf_rec:=x+inf_rec(x-1);
|
|
end;
|
|
|
|
|
|
const
|
|
saveexit : codepointer = nil;
|
|
x : longint = 0;
|
|
|
|
{$S-}
|
|
{ the stack overflowed already so don't do much here and depend on stack_margin }
|
|
procedure stack_check_exit;
|
|
|
|
begin
|
|
exitproc:=saveexit;
|
|
if errorcode<>0 then
|
|
begin
|
|
Writeln('An error occurred at level ',level);
|
|
if errorcode=202 then
|
|
begin
|
|
Writeln('Stack overflow correctly handled');
|
|
erroraddr:=nil;
|
|
errorcode:=0;
|
|
exitcode:=0;
|
|
end
|
|
else if errorcode=216 then
|
|
begin
|
|
Writeln('RTL returns an RTE 216 on stack overflow');
|
|
Writeln('Not perfect, but acceptable');
|
|
erroraddr:=nil;
|
|
errorcode:=0;
|
|
exitcode:=0;
|
|
end;
|
|
end
|
|
else
|
|
begin
|
|
exitcode:=1;
|
|
errorcode:=1;
|
|
end;
|
|
exitproc:=saveexit;
|
|
end;
|
|
|
|
{$ifdef linux}
|
|
var
|
|
limits : TRLimit;
|
|
{$endif linux}
|
|
|
|
begin
|
|
{$ifdef linux}
|
|
FpGetRLimit(RLIMIT_STACK, @limits);
|
|
writeln('Cur: ',limits.rlim_cur);
|
|
writeln('Max: ',limits.rlim_max);
|
|
writeln('StackLength: ',StackLength);
|
|
{$endif linux}
|
|
saveexit:=exitproc;
|
|
exitproc:=@stack_check_exit;
|
|
x:=inf_rec(5000);
|
|
end.
|
|
{$endif CPUAVR}
|