Skip to content

Commit f833fe0

Browse files
authored
Merge pull request #20300 from aschackmull/cfg/successortype
Shared: Add a shared SuccessorType implementation
2 parents d3d737b + 3d4d347 commit f833fe0

File tree

75 files changed

+2472
-4366
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+2472
-4366
lines changed

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

Lines changed: 3 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ private import codeql.controlflow.Cfg as CfgShared
33
private import codeql.Locations
44

55
module Completion {
6+
import codeql.controlflow.SuccessorType
7+
68
private newtype TCompletion =
79
TSimpleCompletion() or
810
TBooleanCompletion(boolean b) { b in [false, true] } or
@@ -25,7 +27,7 @@ module Completion {
2527

2628
override predicate isValidFor(AstNode e) { not any(Completion c).isValidForSpecific(e) }
2729

28-
override NormalSuccessor getAMatchingSuccessorType() { any() }
30+
override DirectSuccessor getAMatchingSuccessorType() { any() }
2931
}
3032

3133
class BooleanCompletion extends NormalCompletion, TBooleanCompletion {
@@ -49,34 +51,6 @@ module Completion {
4951

5052
override ReturnSuccessor getAMatchingSuccessorType() { any() }
5153
}
52-
53-
cached
54-
private newtype TSuccessorType =
55-
TNormalSuccessor() or
56-
TBooleanSuccessor(boolean b) { b in [false, true] } or
57-
TReturnSuccessor()
58-
59-
class SuccessorType extends TSuccessorType {
60-
string toString() { none() }
61-
}
62-
63-
class NormalSuccessor extends SuccessorType, TNormalSuccessor {
64-
override string toString() { result = "successor" }
65-
}
66-
67-
class BooleanSuccessor extends SuccessorType, TBooleanSuccessor {
68-
boolean value;
69-
70-
BooleanSuccessor() { this = TBooleanSuccessor(value) }
71-
72-
override string toString() { result = value.toString() }
73-
74-
boolean getValue() { result = value }
75-
}
76-
77-
class ReturnSuccessor extends SuccessorType, TReturnSuccessor {
78-
override string toString() { result = "return" }
79-
}
8054
}
8155

8256
module CfgScope {
@@ -127,14 +101,8 @@ private module Implementation implements CfgShared::InputSig<Location> {
127101
last(scope.(CompositeAction), e, c)
128102
}
129103

130-
predicate successorTypeIsSimple(SuccessorType t) { t instanceof NormalSuccessor }
131-
132-
predicate successorTypeIsCondition(SuccessorType t) { t instanceof BooleanSuccessor }
133-
134104
SuccessorType getAMatchingSuccessorType(Completion c) { result = c.getAMatchingSuccessorType() }
135105

136-
predicate isAbnormalExitType(SuccessorType t) { none() }
137-
138106
int idOfAstNode(AstNode node) { none() }
139107

140108
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/Caching.qll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ module Stages {
1010
cached
1111
module ControlFlowStage {
1212
private import semmle.code.csharp.controlflow.internal.Splitting
13-
private import semmle.code.csharp.controlflow.internal.SuccessorType
1413
private import semmle.code.csharp.controlflow.Guards as Guards
1514

1615
cached
@@ -20,8 +19,6 @@ module Stages {
2019
private predicate forceCachingInSameStageRev() {
2120
exists(Split s)
2221
or
23-
exists(SuccessorType st)
24-
or
2522
exists(ControlFlow::Node n)
2623
or
2724
Guards::Internal::isCustomNullCheck(_, _, _, _)

csharp/ql/lib/semmle/code/csharp/commons/Constants.qll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ private import semmle.code.csharp.commons.StructuralComparison as StructuralComp
66

77
pragma[noinline]
88
private predicate isConstantCondition0(ControlFlow::Node cfn, boolean b) {
9-
exists(
10-
cfn.getASuccessorByType(any(ControlFlow::SuccessorTypes::BooleanSuccessor t | t.getValue() = b))
11-
) and
9+
exists(cfn.getASuccessorByType(any(ControlFlow::BooleanSuccessor t | t.getValue() = b))) and
1210
strictcount(ControlFlow::SuccessorType t | exists(cfn.getASuccessorByType(t))) = 1
1311
}
1412

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*/
44

55
import csharp
6-
private import ControlFlow::SuccessorTypes
6+
private import ControlFlow
77
private import semmle.code.csharp.controlflow.internal.ControlFlowGraphImpl as CfgImpl
88
private import CfgImpl::BasicBlocks as BasicBlocksImpl
99
private import codeql.controlflow.BasicBlock as BB
@@ -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/ControlFlowElement.qll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ private import semmle.code.csharp.ExprOrStmtParent
55
private import semmle.code.csharp.commons.Compilation
66
private import ControlFlow
77
private import ControlFlow::BasicBlocks
8-
private import SuccessorTypes
98
private import semmle.code.csharp.Caching
109
private import internal.ControlFlowGraphImpl as Impl
1110

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import csharp
66
module ControlFlow {
77
private import semmle.code.csharp.controlflow.BasicBlocks as BBs
88
import semmle.code.csharp.controlflow.internal.SuccessorType
9-
private import SuccessorTypes
109
private import internal.ControlFlowGraphImpl as Impl
1110
private import internal.Splitting as Splitting
1211

0 commit comments

Comments
 (0)