1+ /**
2+ * Provides different types of control flow successor types.
3+ */
4+
15import java
26private import codeql.util.Boolean
37
@@ -6,20 +10,63 @@ private newtype TSuccessorType =
610 TBooleanSuccessor ( Boolean branch ) or
711 TExceptionSuccessor ( )
812
13+ /** The type of a control flow successor. */
914class SuccessorType extends TSuccessorType {
15+ /** Gets a textual representation of successor type. */
1016 string toString ( ) { result = "SuccessorType" }
1117}
1218
19+ /** A normal control flow successor. */
1320class NormalSuccessor extends SuccessorType , TNormalSuccessor { }
1421
22+ /**
23+ * An exceptional control flow successor.
24+ *
25+ * This marks control flow edges that are taken when an exception is thrown.
26+ */
1527class ExceptionSuccessor extends SuccessorType , TExceptionSuccessor { }
1628
29+ /**
30+ * A conditional control flow successor.
31+ *
32+ * This currently only includes boolean successors (`BooleanSuccessor`).
33+ */
1734class ConditionalSuccessor extends SuccessorType , TBooleanSuccessor {
35+ /** Gets the Boolean value of this successor. */
1836 boolean getValue ( ) { this = TBooleanSuccessor ( result ) }
1937}
2038
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+ */
2165class BooleanSuccessor = ConditionalSuccessor ;
2266
67+ /**
68+ * A nullness control flow successor. This is currently unused for Java.
69+ */
2370class NullnessSuccessor extends ConditionalSuccessor {
2471 NullnessSuccessor ( ) { none ( ) }
2572}
0 commit comments