1+ /**
2+ * Provides different types of control flow successor types.
3+ */
4+
15import java
26private import codeql.util.Boolean
37
@@ -6,20 +10,62 @@ private newtype TSuccessorType =
610 TBooleanSuccessor ( Boolean branch ) or
711 TExceptionSuccessor ( )
812
13+ /** The type of a control flow successor. */
914class SuccessorType extends TSuccessorType {
1015 string toString ( ) { result = "SuccessorType" }
1116}
1217
18+ /** A normal control flow successor. */
1319class NormalSuccessor extends SuccessorType , TNormalSuccessor { }
1420
21+ /**
22+ * An exceptional control flow successor.
23+ *
24+ * This marks control flow edges that are taken when an exception is thrown.
25+ */
1526class ExceptionSuccessor extends SuccessorType , TExceptionSuccessor { }
1627
28+ /**
29+ * A conditional control flow successor.
30+ *
31+ * This currently only includes boolean successors (`BooleanSuccessor`).
32+ */
1733class ConditionalSuccessor extends SuccessorType , TBooleanSuccessor {
34+ /** Gets the Boolean value of this successor. */
1835 boolean getValue ( ) { this = TBooleanSuccessor ( result ) }
1936}
2037
38+ /**
39+ * A Boolean control flow successor.
40+ *
41+ * For example, this program fragment:
42+ *
43+ * ```java
44+ * if (x < 0)
45+ * return 0;
46+ * else
47+ * return 1;
48+ * ```
49+ *
50+ * has a control flow graph containing Boolean successors:
51+ *
52+ * ```
53+ * if
54+ * |
55+ * x < 0
56+ * / \
57+ * / \
58+ * / \
59+ * true false
60+ * | \
61+ * return 0 return 1
62+ * ```
63+ */
2164class BooleanSuccessor = ConditionalSuccessor ;
2265
66+ /**
67+ * A nullness control flow successor. This is currently unused for Java.
68+ */
2369class NullnessSuccessor extends ConditionalSuccessor {
2470 NullnessSuccessor ( ) { none ( ) }
2571}
0 commit comments