Skip to content

Commit b14ab7c

Browse files
Examples of issues gnatstack can detect
1 parent a94bc86 commit b14ab7c

10 files changed

+153
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package body Cycles_Example is
2+
3+
procedure Odd (Number : in out Integer) is
4+
begin
5+
Number := Number - 1;
6+
if Number > 0
7+
then
8+
Cycles (Number);
9+
end if;
10+
end Odd;
11+
12+
procedure Even (Number : in out Integer) is
13+
begin
14+
Number := Number - 2;
15+
if Number > 0
16+
then
17+
Cycles (Number);
18+
end if;
19+
end Even;
20+
21+
procedure Cycles (Number : in out Integer) is
22+
Half : constant Integer := Number / 2;
23+
begin
24+
if Half * 2 = Number
25+
then
26+
Even (Number);
27+
else
28+
Odd (Number);
29+
end if;
30+
end Cycles;
31+
32+
end Cycles_Example;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package Cycles_Example is
2+
3+
procedure Cycles (Number : in out Integer);
4+
5+
end Cycles_Example;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
with Cycles_Example;
2+
procedure Cycles_Main is
3+
Number : Integer := 100;
4+
begin
5+
Cycles_Example.Cycles (Number);
6+
end Cycles_Main;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package body Dispatching_Example is
2+
3+
procedure Primitive_One (Param : in out Primitive_T) is
4+
begin
5+
Param.Field := not Param.Field;
6+
Primitive_Two (Param);
7+
Primitive_Two (Primitive_T'Class (Param));
8+
end Primitive_One;
9+
10+
procedure Primitive_Two (Param : in out Primitive_T) is
11+
begin
12+
null;
13+
Param.Field := not Param.Field;
14+
end Primitive_Two;
15+
16+
overriding procedure Primitive_Two (Param : in out Derived_T) is
17+
begin
18+
null;
19+
Param.Field := not Param.Field;
20+
end Primitive_Two;
21+
22+
procedure Calls is
23+
One : Primitive_T;
24+
Two : Derived_T;
25+
begin
26+
Primitive_One (One);
27+
Primitive_One (Two);
28+
end Calls;
29+
30+
end Dispatching_Example;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package Dispatching_Example is
2+
3+
type Primitive_T is tagged record
4+
Field : Boolean;
5+
end record;
6+
procedure Primitive_One (Param : in out Primitive_T);
7+
procedure Primitive_Two (Param : in out Primitive_T);
8+
9+
type Derived_T is new Primitive_T with null record;
10+
overriding procedure Primitive_Two (Param : in out Derived_T);
11+
12+
procedure Calls;
13+
14+
end Dispatching_Example;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
with Dispatching_Example;
2+
procedure Dispatching_Main is
3+
begin
4+
Dispatching_Example.Calls;
5+
end Dispatching_Main;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package body Indirect_Example is
2+
3+
type Subprogram_Access_T is access procedure
4+
(A, B : Integer;
5+
C : out Boolean);
6+
procedure Procedure_One
7+
(A, B : Integer;
8+
C : out Boolean) is
9+
begin
10+
C := A > B;
11+
end Procedure_One;
12+
13+
procedure Procedure_Two
14+
(A, B : Integer;
15+
C : out Boolean) is
16+
begin
17+
C := A < B;
18+
end Procedure_Two;
19+
20+
Calls : array (Boolean) of Subprogram_Access_T :=
21+
(Procedure_One'Access,
22+
Procedure_Two'Access);
23+
24+
procedure Test (Flag : in out Boolean) is
25+
begin
26+
Calls (Flag).all (1, 2, Flag);
27+
end Test;
28+
29+
end Indirect_Example;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package Indirect_Example is
2+
3+
procedure Test (Flag : in out Boolean);
4+
5+
end Indirect_Example;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
with Indirect_Example;
2+
procedure Indirect_Main is
3+
Flag : Boolean := True;
4+
begin
5+
Indirect_Example.Test (Flag);
6+
end Indirect_Main;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
procedure Main_Unit is
2+
type Data_Type is array (1 .. 5) of Integer;
3+
4+
function Inverse
5+
(Input : Data_Type)
6+
return Data_Type is
7+
Result : Data_Type;
8+
begin
9+
for Index in Data_Type'Range
10+
loop
11+
Result (Index) := Input (Data_Type'Last - (Index - Data_Type'First));
12+
end loop;
13+
14+
return Result;
15+
end Inverse;
16+
17+
Data : Data_Type := (1, 2, 3, 4, 5);
18+
Result : Data_Type;
19+
begin
20+
Result := Inverse (Data);
21+
end Main_Unit;

0 commit comments

Comments
 (0)