Skip to content

Commit 203b206

Browse files
committed
WI #2045 Enhance abstract execution scheme with cyclic threshold
1 parent 7f8af6b commit 203b206

18 files changed

+692
-32
lines changed

TypeCobol.Analysis.Test/BasicAbstractInterpretationTest.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ private void TestTemplate(
5858
Assert.IsNull(cfg.ParentGraph);
5959
Assert.IsTrue(cfg.ProgramOrFunctionNode is Program);
6060
Assert.IsNull(cfg.NestedGraphs);
61-
GenAbstractInterpretCfgAndCompare(cfg, inputFilePath, expectedResultFilePath, fullInstruction);
61+
GenAbstractInterpretCfgAndCompare(cfg, 1, inputFilePath, expectedResultFilePath, fullInstruction);
6262
}
6363

6464
[TestMethod]
@@ -107,6 +107,9 @@ private void TestTemplate(
107107
[TestMethod]
108108
public void ComplexGotoPara0() => TestTemplate();
109109

110+
[TestMethod]
111+
public void ComplexCyclicGotoPara0() => TestTemplate();
112+
110113
[TestMethod]
111114
public void Declaratives0() => TestTemplate();
112115

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
IDENTIFICATION DIVISION.
2+
PROGRAM-ID. GOTOCplx.
3+
4+
DATA DIVISION.
5+
WORKING-STORAGE SECTION.
6+
01 m PIC 9 VALUE 2.
7+
8+
PROCEDURE DIVISION.
9+
PARA-A.
10+
DISPLAY 'IN PARA-A'
11+
GO TO PARA-C.
12+
13+
PARA-B.
14+
DISPLAY 'IN PARA-B '.
15+
16+
PARA-C.
17+
DISPLAY 'IN PARA-C '.
18+
GO TO PARA-E PARA-F PARA-G DEPENDING ON m.
19+
20+
PARA-D.
21+
DISPLAY 'IN PARA-D '.
22+
23+
PARA-E.
24+
DISPLAY 'IN PARA-E '.
25+
GO TO PARA-C.
26+
27+
PARA-F.
28+
DISPLAY 'IN PARA-F '.
29+
30+
PARA-G.
31+
DISPLAY 'IN PARA-G '.
32+
33+
GOBACK.
34+
END PROGRAM GOTOCplx.
35+
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
--- Diagnostics ---
2+
Line 14[8,27] <37, Warning, General> - Warning: Unreachable code detected
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
digraph Cfg {
2+
node [
3+
shape = "record"
4+
]
5+
6+
edge [
7+
arrowtail = "empty"
8+
]
9+
Block0 [
10+
label = "{START|}"
11+
]
12+
Block1 [
13+
label = "{PARA-A. Block1|DISPLAY 'IN PARA-A'\lGO TO PARA-C\l}"
14+
]
15+
Block4 [
16+
label = "{PARA-C. Block4|DISPLAY 'IN PARA-C '\l}"
17+
]
18+
Block5 [
19+
label = "{PARA-C. Block5|GO TO PARA-E PARA-F PARA-G DEPENDING ON m\l}"
20+
]
21+
Block6 [
22+
label = "{Block6|}"
23+
]
24+
Block7 [
25+
label = "{PARA-D. Block7|DISPLAY 'IN PARA-D '\l}"
26+
]
27+
Block8 [
28+
label = "{PARA-E. Block8|DISPLAY 'IN PARA-E '\l}"
29+
]
30+
Block9 [
31+
label = "{PARA-E. Block9|GO TO PARA-C\l}"
32+
]
33+
Block11 [
34+
label = "{PARA-F. Block11|DISPLAY 'IN PARA-F '\l}"
35+
]
36+
Block12 [
37+
label = "{PARA-G. Block12|DISPLAY 'IN PARA-G '\l}"
38+
]
39+
Block13 [
40+
label = "{PARA-G. Block13|GOBACK\l}"
41+
]
42+
Block0 -> Block1
43+
Block1 -> Block4
44+
Block4 -> Block5
45+
Block5 -> Block6
46+
Block5 -> Block8
47+
Block5 -> Block11
48+
Block5 -> Block12
49+
Block6 -> Block7
50+
Block7 -> Block8
51+
Block8 -> Block9
52+
Block9 -> Block4
53+
Block11 -> Block12
54+
Block12 -> Block13
55+
56+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
Entering block : 0
2+
Leaving block : 0
3+
Entering block : 1
4+
DISPLAY 'IN PARA-A'
5+
GO TO PARA-C
6+
Leaving block : 1
7+
Entering block : 4
8+
DISPLAY 'IN PARA-C '
9+
Leaving block : 4
10+
Entering block : 5
11+
GO TO PARA-E PARA-F PARA-G DEPENDING ON m
12+
Leaving block : 5
13+
Entering block : 12
14+
DISPLAY 'IN PARA-G '
15+
Leaving block : 12
16+
Entering block : 13
17+
GOBACK
18+
Leaving block : 13
19+
Entering block : 11
20+
DISPLAY 'IN PARA-F '
21+
Leaving block : 11
22+
Entering block : 12
23+
DISPLAY 'IN PARA-G '
24+
Leaving block : 12
25+
Entering block : 13
26+
GOBACK
27+
Leaving block : 13
28+
Entering block : 8
29+
DISPLAY 'IN PARA-E '
30+
Leaving block : 8
31+
Entering block : 9
32+
GO TO PARA-C
33+
Leaving block : 9
34+
Entering block : 4
35+
DISPLAY 'IN PARA-C '
36+
Leaving block : 4
37+
Entering block : 5
38+
GO TO PARA-E PARA-F PARA-G DEPENDING ON m
39+
Leaving block : 5
40+
Entering block : 12
41+
DISPLAY 'IN PARA-G '
42+
Leaving block : 12
43+
Entering block : 13
44+
GOBACK
45+
Leaving block : 13
46+
Entering block : 11
47+
DISPLAY 'IN PARA-F '
48+
Leaving block : 11
49+
Entering block : 12
50+
DISPLAY 'IN PARA-G '
51+
Leaving block : 12
52+
Entering block : 13
53+
GOBACK
54+
Leaving block : 13
55+
Entering block : 8
56+
DISPLAY 'IN PARA-E '
57+
Leaving block : 8
58+
Entering block : 9
59+
GO TO PARA-C
60+
Leaving block : 9
61+
Entering block : 6
62+
Leaving block : 6
63+
Entering block : 7
64+
DISPLAY 'IN PARA-D '
65+
Leaving block : 7
66+
Entering block : 8
67+
DISPLAY 'IN PARA-E '
68+
Leaving block : 8
69+
Entering block : 9
70+
GO TO PARA-C
71+
Leaving block : 9
72+
Entering block : 6
73+
Leaving block : 6
74+
Entering block : 7
75+
DISPLAY 'IN PARA-D '
76+
Leaving block : 7
77+
Entering block : 8
78+
DISPLAY 'IN PARA-E '
79+
Leaving block : 8
80+
Entering block : 9
81+
GO TO PARA-C
82+
Leaving block : 9
83+
84+
=======
85+
METRICS
86+
=======
87+
{EdgeCount=13; NodeCount=11; ControlSubgraphCount=0; HighCyclomaticComplexity=4; HighEssentialComplexityPath=4}

TypeCobol.Analysis.Test/BasicCfgInstrs/ComplexGotoPara0.int

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,41 @@ Leaving block : 11
1919
Entering block : 9
2020
DISPLAY 'IN PARA-F '
2121
Leaving block : 9
22+
Entering block : 10
23+
DISPLAY 'IN PARA-G '
24+
Leaving block : 10
25+
Entering block : 11
26+
GOBACK
27+
Leaving block : 11
2228
Entering block : 8
2329
DISPLAY 'IN PARA-E '
2430
Leaving block : 8
31+
Entering block : 9
32+
DISPLAY 'IN PARA-F '
33+
Leaving block : 9
34+
Entering block : 10
35+
DISPLAY 'IN PARA-G '
36+
Leaving block : 10
37+
Entering block : 11
38+
GOBACK
39+
Leaving block : 11
2540
Entering block : 6
2641
Leaving block : 6
2742
Entering block : 7
2843
DISPLAY 'IN PARA-D '
2944
Leaving block : 7
45+
Entering block : 8
46+
DISPLAY 'IN PARA-E '
47+
Leaving block : 8
48+
Entering block : 9
49+
DISPLAY 'IN PARA-F '
50+
Leaving block : 9
51+
Entering block : 10
52+
DISPLAY 'IN PARA-G '
53+
Leaving block : 10
54+
Entering block : 11
55+
GOBACK
56+
Leaving block : 11
3057

3158
=======
3259
METRICS

0 commit comments

Comments
 (0)