Skip to content

Commit 144e34c

Browse files
committed
Shared: Use shared SuccessorType in shared Cfg and BasicBlock libs.
1 parent 4685b4f commit 144e34c

File tree

22 files changed

+101
-131
lines changed

22 files changed

+101
-131
lines changed

actions/ql/lib/codeql/actions/controlflow/internal/Cfg.qll

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -101,14 +101,8 @@ private module Implementation implements CfgShared::InputSig<Location> {
101101
last(scope.(CompositeAction), e, c)
102102
}
103103

104-
predicate successorTypeIsSimple(SuccessorType t) { t instanceof DirectSuccessor }
105-
106-
predicate successorTypeIsCondition(SuccessorType t) { t instanceof BooleanSuccessor }
107-
108104
SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() }
109105

110-
predicate isAbnormalExitType(SuccessorType t) { none() }
111-
112106
int idOfAstNode(AstNode node) { none() }
113107

114108
int idOfCfgScope(CfgScope scope) { none() }

cpp/ql/lib/semmle/code/cpp/ir/implementation/EdgeKind.qll

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
* Provides classes that specify the conditions under which control flows along a given edge.
33
*/
44

5+
private import codeql.controlflow.SuccessorType
56
private import internal.EdgeKindInternal
67

78
private newtype TEdgeKind =
@@ -28,6 +29,21 @@ abstract private class EdgeKindImpl extends TEdgeKind {
2829

2930
final class EdgeKind = EdgeKindImpl;
3031

32+
private SuccessorType getAMatchingSpecificSuccessorType(EdgeKind k) {
33+
result.(BooleanSuccessor).getValue() = true and k instanceof TrueEdge
34+
or
35+
result.(BooleanSuccessor).getValue() = false and k instanceof FalseEdge
36+
or
37+
result instanceof ExceptionSuccessor and k instanceof ExceptionEdge
38+
}
39+
40+
SuccessorType getAMatchingSuccessorType(EdgeKind k) {
41+
result = getAMatchingSpecificSuccessorType(k)
42+
or
43+
not exists(getAMatchingSpecificSuccessorType(k)) and
44+
result instanceof DirectSuccessor
45+
}
46+
3147
/**
3248
* A "goto" edge, representing the unconditional successor of an `Instruction`
3349
* or `IRBlock`.

cpp/ql/lib/semmle/code/cpp/ir/implementation/aliased_ssa/IRBlock.qll

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) {
265265
}
266266

267267
module IRCfg implements BB::CfgSig<Language::Location> {
268-
class ControlFlowNode = Instruction;
268+
private import codeql.controlflow.SuccessorType
269269

270-
class SuccessorType = EdgeKind;
270+
class ControlFlowNode = Instruction;
271271

272272
final private class FinalIRBlock = IRBlock;
273273

@@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig<Language::Location> {
280280

281281
BasicBlock getASuccessor() { result = super.getASuccessor() }
282282

283-
BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
283+
BasicBlock getASuccessor(SuccessorType t) {
284+
exists(EdgeKind k |
285+
result = super.getSuccessor(k) and
286+
t = getAMatchingSuccessorType(k)
287+
)
288+
}
284289

285290
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
286291

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/IRBlock.qll

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) {
265265
}
266266

267267
module IRCfg implements BB::CfgSig<Language::Location> {
268-
class ControlFlowNode = Instruction;
268+
private import codeql.controlflow.SuccessorType
269269

270-
class SuccessorType = EdgeKind;
270+
class ControlFlowNode = Instruction;
271271

272272
final private class FinalIRBlock = IRBlock;
273273

@@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig<Language::Location> {
280280

281281
BasicBlock getASuccessor() { result = super.getASuccessor() }
282282

283-
BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
283+
BasicBlock getASuccessor(SuccessorType t) {
284+
exists(EdgeKind k |
285+
result = super.getSuccessor(k) and
286+
t = getAMatchingSuccessorType(k)
287+
)
288+
}
284289

285290
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
286291

cpp/ql/lib/semmle/code/cpp/ir/implementation/unaliased_ssa/IRBlock.qll

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -265,9 +265,9 @@ private predicate isEntryBlock(TIRBlock block) {
265265
}
266266

267267
module IRCfg implements BB::CfgSig<Language::Location> {
268-
class ControlFlowNode = Instruction;
268+
private import codeql.controlflow.SuccessorType
269269

270-
class SuccessorType = EdgeKind;
270+
class ControlFlowNode = Instruction;
271271

272272
final private class FinalIRBlock = IRBlock;
273273

@@ -280,7 +280,12 @@ module IRCfg implements BB::CfgSig<Language::Location> {
280280

281281
BasicBlock getASuccessor() { result = super.getASuccessor() }
282282

283-
BasicBlock getASuccessor(SuccessorType t) { result = super.getSuccessor(t) }
283+
BasicBlock getASuccessor(SuccessorType t) {
284+
exists(EdgeKind k |
285+
result = super.getSuccessor(k) and
286+
t = getAMatchingSuccessorType(k)
287+
)
288+
}
284289

285290
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
286291

csharp/ql/lib/semmle/code/csharp/controlflow/BasicBlocks.qll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -346,8 +346,6 @@ private class EntryBasicBlockAlias = EntryBasicBlock;
346346
module Cfg implements BB::CfgSig<Location> {
347347
class ControlFlowNode = ControlFlow::Node;
348348

349-
class SuccessorType = ControlFlow::SuccessorType;
350-
351349
class BasicBlock = BasicBlockAlias;
352350

353351
class EntryBasicBlock = EntryBasicBlockAlias;

csharp/ql/lib/semmle/code/csharp/controlflow/internal/ControlFlowGraphImpl.qll

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -79,19 +79,10 @@ private module CfgInput implements CfgShared::InputSig<Location> {
7979
Impl::scopeLast(scope, last, c)
8080
}
8181

82-
class SuccessorType = ST::SuccessorType;
82+
private class SuccessorType = ST::SuccessorType;
8383

8484
SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() }
8585

86-
predicate successorTypeIsSimple(SuccessorType t) { t instanceof ST::DirectSuccessor }
87-
88-
predicate successorTypeIsCondition(SuccessorType t) { t instanceof ST::ConditionalSuccessor }
89-
90-
predicate isAbnormalExitType(SuccessorType t) {
91-
t instanceof ST::ExceptionSuccessor or
92-
t instanceof ST::ExitSuccessor
93-
}
94-
9586
int idOfAstNode(AstNode node) { result = node.getId() }
9687

9788
int idOfCfgScope(CfgScope node) { result = idOfAstNode(node) }

csharp/ql/lib/semmle/code/csharp/controlflow/internal/PreBasicBlocks.qll

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -163,8 +163,6 @@ class ConditionBlock extends PreBasicBlock {
163163
module PreCfg implements BB::CfgSig<Location> {
164164
class ControlFlowNode = ControlFlowElement;
165165

166-
class SuccessorType = Cfg::SuccessorType;
167-
168166
class BasicBlock = PreBasicBlock;
169167

170168
class EntryBasicBlock extends BasicBlock {

java/ql/lib/semmle/code/java/controlflow/BasicBlocks.qll

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ module;
77
import java
88
import Dominance
99
private import codeql.controlflow.BasicBlock as BB
10+
private import codeql.controlflow.SuccessorType
1011

1112
private module Input implements BB::InputSig<Location> {
12-
import codeql.controlflow.SuccessorType
13-
1413
/** Hold if `t` represents a conditional successor type. */
1514
predicate successorTypeIsCondition(SuccessorType t) { none() }
1615

@@ -96,7 +95,7 @@ class BasicBlock extends BbImpl::BasicBlock {
9695
predicate strictlyDominates(BasicBlock bb) { super.strictlyDominates(bb) }
9796

9897
/** Gets an immediate successor of this basic block of a given type, if any. */
99-
BasicBlock getASuccessor(Input::SuccessorType t) { result = super.getASuccessor(t) }
98+
BasicBlock getASuccessor(SuccessorType t) { result = super.getASuccessor(t) }
10099

101100
BasicBlock getASuccessor() { result = super.getASuccessor() }
102101

@@ -161,8 +160,6 @@ private class BasicBlockAlias = BasicBlock;
161160
module Cfg implements BB::CfgSig<Location> {
162161
class ControlFlowNode = BbImpl::ControlFlowNode;
163162

164-
class SuccessorType = BbImpl::SuccessorType;
165-
166163
class BasicBlock = BasicBlockAlias;
167164

168165
class EntryBasicBlock extends BasicBlock instanceof BbImpl::EntryBasicBlock { }

java/ql/lib/semmle/code/java/controlflow/Guards.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ private predicate isNonFallThroughPredecessor(SwitchCase sc, ControlFlowNode pre
139139
)
140140
}
141141

142-
private module SuccessorTypes implements SharedGuards::SuccessorTypesSig<SuccessorType> {
142+
private module SuccessorTypes implements SharedGuards::SuccessorTypesSig {
143143
import codeql.controlflow.SuccessorType
144144
}
145145

0 commit comments

Comments
 (0)