Skip to content

Commit 3b753da

Browse files
committed
Rust: Expose SuccessorType and sub classes
1 parent 6ae03e6 commit 3b753da

File tree

4 files changed

+41
-29
lines changed

4 files changed

+41
-29
lines changed

rust/ql/lib/codeql/rust/controlflow/ControlFlowGraph.qll

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@ private import BasicBlocks
99

1010
final class CfgScope = Scope::CfgScope;
1111

12+
final class SuccessorType = SuccessorTypeImpl;
13+
14+
final class NormalSuccessor = NormalSuccessorImpl;
15+
16+
final class ConditionalSuccessor = ConditionalSuccessorImpl;
17+
18+
final class BooleanSuccessor = BooleanSuccessorImpl;
19+
20+
final class MatchSuccessor = MatchSuccessorImpl;
21+
22+
final class LoopJumpSuccessor = LoopJumpSuccessorImpl;
23+
24+
final class ReturnSuccessor = ReturnSuccessorImpl;
25+
1226
/**
1327
* A control flow node.
1428
*

rust/ql/lib/codeql/rust/controlflow/internal/Completion.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ private import codeql.rust.controlflow.ControlFlowGraph
33
private import rust
44
private import SuccessorType
55

6-
private newtype TCompletion =
6+
newtype TCompletion =
77
TSimpleCompletion() or
88
TBooleanCompletion(Boolean b) or
99
TMatchCompletion(Boolean isMatch) or

rust/ql/lib/codeql/rust/controlflow/internal/ControlFlowGraphImpl.qll

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
private import rust
22
import codeql.controlflow.Cfg
33
import Completion
4-
import codeql.controlflow.Cfg
5-
private import SuccessorType as ST
64
private import Scope as Scope
5+
private import codeql.rust.controlflow.ControlFlowGraph as Cfg
76

87
private module CfgInput implements InputSig<Location> {
98
private import rust as Rust
@@ -29,21 +28,21 @@ private module CfgInput implements InputSig<Location> {
2928

3029
class Split = S::Split;
3130

32-
class SuccessorType = ST::SuccessorType;
31+
class SuccessorType = Cfg::SuccessorType;
3332

3433
/** Gets a successor type that matches completion `c`. */
3534
SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() }
3635

3736
/**
3837
* Hold if `c` represents simple (normal) evaluation of a statement or an expression.
3938
*/
40-
predicate successorTypeIsSimple(SuccessorType t) { t instanceof ST::NormalSuccessor }
39+
predicate successorTypeIsSimple(SuccessorType t) { t instanceof Cfg::NormalSuccessor }
4140

4241
/** Holds if `t` is an abnormal exit type out of a CFG scope. */
4342
predicate isAbnormalExitType(SuccessorType t) { none() }
4443

4544
/** Hold if `t` represents a conditional successor type. */
46-
predicate successorTypeIsCondition(SuccessorType t) { t instanceof ST::BooleanSuccessor }
45+
predicate successorTypeIsCondition(SuccessorType t) { t instanceof Cfg::BooleanSuccessor }
4746

4847
/** Gets the maximum number of splits allowed for a given node. */
4948
int maxSplits() { result = 0 }
Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
private import rust
22
private import codeql.util.Boolean
3+
private import Completion
34

45
newtype TLoopJumpType =
56
TContinueJump() or
@@ -14,45 +15,43 @@ newtype TSuccessorType =
1415
TSuccessorSuccessor() or
1516
TBooleanSuccessor(Boolean b) or
1617
TMatchSuccessor(Boolean b) or
17-
TLoopSuccessor(TLoopJumpType kind, TLabelType label) or
18+
TLoopSuccessor(TLoopJumpType kind, TLabelType label) { exists(TLoopCompletion(kind, label)) } or
1819
TReturnSuccessor()
1920

2021
/** The type of a control flow successor. */
21-
abstract private class SuccessorTypeImpl extends TSuccessorType {
22+
abstract class SuccessorTypeImpl extends TSuccessorType {
2223
/** Gets a textual representation of successor type. */
2324
abstract string toString();
2425
}
2526

26-
final class SuccessorType = SuccessorTypeImpl;
27-
2827
/** A normal control flow successor. */
29-
final class NormalSuccessor extends SuccessorTypeImpl, TSuccessorSuccessor {
30-
final override string toString() { result = "successor" }
28+
class NormalSuccessorImpl extends SuccessorTypeImpl, TSuccessorSuccessor {
29+
override string toString() { result = "successor" }
3130
}
3231

3332
/** A conditional control flow successor. */
34-
abstract private class ConditionalSuccessor extends SuccessorTypeImpl {
33+
abstract class ConditionalSuccessorImpl extends SuccessorTypeImpl {
3534
boolean value;
3635

3736
bindingset[value]
38-
ConditionalSuccessor() { any() }
37+
ConditionalSuccessorImpl() { any() }
3938

4039
/** Gets the Boolean value of this successor. */
41-
final boolean getValue() { result = value }
40+
boolean getValue() { result = value }
4241
}
4342

4443
/** A Boolean control flow successor for a boolean conditon. */
45-
final class BooleanSuccessor extends ConditionalSuccessor, TBooleanSuccessor {
46-
BooleanSuccessor() { this = TBooleanSuccessor(value) }
44+
class BooleanSuccessorImpl extends ConditionalSuccessorImpl, TBooleanSuccessor {
45+
BooleanSuccessorImpl() { this = TBooleanSuccessor(value) }
4746

4847
override string toString() { result = this.getValue().toString() }
4948
}
5049

5150
/**
5251
* A control flow successor of a pattern match.
5352
*/
54-
final class MatchSuccessor extends ConditionalSuccessor, TMatchSuccessor {
55-
MatchSuccessor() { this = TMatchSuccessor(value) }
53+
class MatchSuccessorImpl extends ConditionalSuccessorImpl, TMatchSuccessor {
54+
MatchSuccessorImpl() { this = TMatchSuccessor(value) }
5655

5756
override string toString() {
5857
if this.getValue() = true then result = "match" else result = "no-match"
@@ -62,20 +61,20 @@ final class MatchSuccessor extends ConditionalSuccessor, TMatchSuccessor {
6261
/**
6362
* A control flow successor of a loop control flow expression, `continue` or `break`.
6463
*/
65-
final class LoopJumpSuccessor extends SuccessorTypeImpl, TLoopSuccessor {
66-
final private TLoopJumpType getKind() { this = TLoopSuccessor(result, _) }
64+
class LoopJumpSuccessorImpl extends SuccessorTypeImpl, TLoopSuccessor {
65+
private TLoopJumpType getKind() { this = TLoopSuccessor(result, _) }
6766

68-
final private TLabelType getLabelType() { this = TLoopSuccessor(_, result) }
67+
private TLabelType getLabelType() { this = TLoopSuccessor(_, result) }
6968

70-
final predicate hasLabel() { this.getLabelType() = TLabel(_) }
69+
predicate hasLabel() { this.getLabelType() = TLabel(_) }
7170

72-
final string getLabelName() { this = TLoopSuccessor(_, TLabel(result)) }
71+
string getLabelName() { this = TLoopSuccessor(_, TLabel(result)) }
7372

74-
final predicate isContinue() { this.getKind() = TContinueJump() }
73+
predicate isContinue() { this.getKind() = TContinueJump() }
7574

76-
final predicate isBreak() { this.getKind() = TBreakJump() }
75+
predicate isBreak() { this.getKind() = TBreakJump() }
7776

78-
final override string toString() {
77+
override string toString() {
7978
exists(string kind, string label |
8079
(if this.isContinue() then kind = "continue" else kind = "break") and
8180
(if this.hasLabel() then label = "(" + this.getLabelName() + ")" else label = "") and
@@ -87,6 +86,6 @@ final class LoopJumpSuccessor extends SuccessorTypeImpl, TLoopSuccessor {
8786
/**
8887
* A `return` control flow successor.
8988
*/
90-
final class ReturnSuccessor extends SuccessorTypeImpl, TReturnSuccessor {
91-
final override string toString() { result = "return" }
89+
class ReturnSuccessorImpl extends SuccessorTypeImpl, TReturnSuccessor {
90+
override string toString() { result = "return" }
9291
}

0 commit comments

Comments
 (0)