1
+ /**
2
+ * Provides different types of control flow successor types.
3
+ */
4
+
1
5
import java
2
6
private import codeql.util.Boolean
3
7
@@ -6,20 +10,63 @@ private newtype TSuccessorType =
6
10
TBooleanSuccessor ( Boolean branch ) or
7
11
TExceptionSuccessor ( )
8
12
13
+ /** The type of a control flow successor. */
9
14
class SuccessorType extends TSuccessorType {
15
+ /** Gets a textual representation of successor type. */
10
16
string toString ( ) { result = "SuccessorType" }
11
17
}
12
18
19
+ /** A normal control flow successor. */
13
20
class NormalSuccessor extends SuccessorType , TNormalSuccessor { }
14
21
22
+ /**
23
+ * An exceptional control flow successor.
24
+ *
25
+ * This marks control flow edges that are taken when an exception is thrown.
26
+ */
15
27
class ExceptionSuccessor extends SuccessorType , TExceptionSuccessor { }
16
28
29
+ /**
30
+ * A conditional control flow successor.
31
+ *
32
+ * This currently only includes boolean successors (`BooleanSuccessor`).
33
+ */
17
34
class ConditionalSuccessor extends SuccessorType , TBooleanSuccessor {
35
+ /** Gets the Boolean value of this successor. */
18
36
boolean getValue ( ) { this = TBooleanSuccessor ( result ) }
19
37
}
20
38
39
+ /**
40
+ * A Boolean control flow successor.
41
+ *
42
+ * For example, this program fragment:
43
+ *
44
+ * ```java
45
+ * if (x < 0)
46
+ * return 0;
47
+ * else
48
+ * return 1;
49
+ * ```
50
+ *
51
+ * has a control flow graph containing Boolean successors:
52
+ *
53
+ * ```
54
+ * if
55
+ * |
56
+ * x < 0
57
+ * / \
58
+ * / \
59
+ * / \
60
+ * true false
61
+ * | \
62
+ * return 0 return 1
63
+ * ```
64
+ */
21
65
class BooleanSuccessor = ConditionalSuccessor ;
22
66
67
+ /**
68
+ * A nullness control flow successor. This is currently unused for Java.
69
+ */
23
70
class NullnessSuccessor extends ConditionalSuccessor {
24
71
NullnessSuccessor ( ) { none ( ) }
25
72
}
0 commit comments