Skip to content

Commit 8632cbe

Browse files
hvitvedaibaars
authored andcommitted
CFG: Do not descend into nested scopes
1 parent 30cb2cc commit 8632cbe

File tree

2 files changed

+13
-41
lines changed

2 files changed

+13
-41
lines changed

ql/src/codeql_ruby/controlflow/internal/ControlFlowGraphImpl.qll

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,14 @@ abstract private class StandardNode extends ControlFlowTree {
141141
abstract AstNode getChildNode(int i);
142142

143143
private AstNode getChildNodeRanked(int i) {
144-
result = rank[i + 1](AstNode child, int j | child = this.getChildNode(j) | child order by j)
144+
result =
145+
rank[i + 1](AstNode child, int j |
146+
child = this.getChildNode(j) and
147+
// Never descend into children with a separate scope
148+
not child instanceof CfgScope
149+
|
150+
child order by j
151+
)
145152
}
146153

147154
/** Gets the first child node of this element. */
@@ -150,24 +157,17 @@ abstract private class StandardNode extends ControlFlowTree {
150157
/** Gets the last child node of this node. */
151158
final AstNode getLastChildNode() {
152159
exists(int last |
153-
last = max(int i | exists(this.getChildNodeRanked(i))) and
154-
result = this.getChildNodeRanked(last)
160+
result = this.getChildNodeRanked(last) and
161+
not exists(this.getChildNodeRanked(last + 1))
155162
)
156163
}
157164

158-
/** Gets the `i`th child, which is not the last node. */
159-
pragma[nomagic]
160-
private AstNode getNonLastChildNode(int i) {
161-
result = this.getChildNodeRanked(i) and
162-
not result = this.getLastChildNode()
163-
}
164-
165-
final override predicate propagatesAbnormal(AstNode child) { child = this.getChildNode(_) }
165+
final override predicate propagatesAbnormal(AstNode child) { child = this.getChildNodeRanked(_) }
166166

167167
pragma[nomagic]
168168
override predicate succ(AstNode pred, AstNode succ, Completion c) {
169169
exists(int i |
170-
last(this.getNonLastChildNode(i), pred, c) and
170+
last(this.getChildNodeRanked(i), pred, c) and
171171
c instanceof NormalCompletion and
172172
first(this.getChildNodeRanked(i + 1), succ)
173173
)
@@ -428,7 +428,7 @@ private module Trees {
428428
final override AstNode getChildNode(int i) { result = this.getChild(i) }
429429
}
430430

431-
private class ProgramTree extends StandardPostOrderTree, Program {
431+
private class ProgramTree extends StandardPreOrderTree, Program {
432432
final override AstNode getChildNode(int i) { result = this.getChild(i) }
433433

434434
override predicate isHidden() { any() }

ql/test/library-tests/controlflow/graph/Cfg.expected

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,6 @@ nodes
33
| exit.rb:1:1:6:3 | exit m1 |
44
| exit.rb:1:1:6:3 | exit m1 (abnormal) |
55
| exit.rb:1:1:6:3 | exit m1 (normal) |
6-
| exit.rb:1:1:13:4 | enter top-level |
7-
| exit.rb:1:1:13:4 | exit top-level |
8-
| exit.rb:1:1:13:4 | exit top-level (abnormal) |
96
| exit.rb:2:3:4:5 | If |
107
| exit.rb:2:6:2:6 | x |
118
| exit.rb:2:6:2:10 | Binary |
@@ -33,9 +30,6 @@ nodes
3330
| ifs.rb:1:1:9:3 | enter m1 |
3431
| ifs.rb:1:1:9:3 | exit m1 |
3532
| ifs.rb:1:1:9:3 | exit m1 (normal) |
36-
| ifs.rb:1:1:26:4 | enter top-level |
37-
| ifs.rb:1:1:26:4 | exit top-level |
38-
| ifs.rb:1:1:26:4 | exit top-level (normal) |
3933
| ifs.rb:2:3:8:5 | If |
4034
| ifs.rb:2:6:2:6 | x |
4135
| ifs.rb:2:6:2:10 | Binary |
@@ -102,7 +96,6 @@ nodes
10296
| loops.rb:1:1:6:3 | enter m1 |
10397
| loops.rb:1:1:6:3 | exit m1 |
10498
| loops.rb:1:1:6:3 | exit m1 (normal) |
105-
| loops.rb:1:1:28:3 | enter top-level |
10699
| loops.rb:2:3:5:5 | While |
107100
| loops.rb:2:9:2:9 | x |
108101
| loops.rb:2:9:2:14 | Binary |
@@ -167,9 +160,6 @@ nodes
167160
| raise.rb:1:1:6:3 | exit m1 |
168161
| raise.rb:1:1:6:3 | exit m1 (abnormal) |
169162
| raise.rb:1:1:6:3 | exit m1 (normal) |
170-
| raise.rb:1:1:6:4 | enter top-level |
171-
| raise.rb:1:1:6:4 | exit top-level |
172-
| raise.rb:1:1:6:4 | exit top-level (abnormal) |
173163
| raise.rb:2:3:4:5 | If |
174164
| raise.rb:2:6:2:6 | x |
175165
| raise.rb:2:6:2:10 | Binary |
@@ -184,20 +174,16 @@ edges
184174
| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | If | semmle.label | successor |
185175
| exit.rb:1:1:6:3 | exit m1 (abnormal) | exit.rb:1:1:6:3 | exit m1 | semmle.label | successor |
186176
| exit.rb:1:1:6:3 | exit m1 (normal) | exit.rb:1:1:6:3 | exit m1 | semmle.label | successor |
187-
| exit.rb:1:1:13:4 | enter top-level | exit.rb:2:3:4:5 | If | semmle.label | successor |
188-
| exit.rb:1:1:13:4 | exit top-level (abnormal) | exit.rb:1:1:13:4 | exit top-level | semmle.label | successor |
189177
| exit.rb:2:3:4:5 | If | exit.rb:2:6:2:6 | x | semmle.label | successor |
190178
| exit.rb:2:6:2:6 | x | exit.rb:2:10:2:10 | 2 | semmle.label | successor |
191179
| exit.rb:2:6:2:10 | Binary | exit.rb:3:10:3:10 | 1 | semmle.label | true |
192180
| exit.rb:2:6:2:10 | Binary | exit.rb:5:8:5:15 | String | semmle.label | false |
193181
| exit.rb:2:10:2:10 | 2 | exit.rb:2:6:2:10 | Binary | semmle.label | successor |
194182
| exit.rb:3:5:3:8 | exit | exit.rb:3:5:3:10 | MethodCall | semmle.label | successor |
195183
| exit.rb:3:5:3:10 | MethodCall | exit.rb:1:1:6:3 | exit m1 (abnormal) | semmle.label | exit |
196-
| exit.rb:3:5:3:10 | MethodCall | exit.rb:1:1:13:4 | exit top-level (abnormal) | semmle.label | exit |
197184
| exit.rb:3:10:3:10 | 1 | exit.rb:3:5:3:8 | exit | semmle.label | successor |
198185
| exit.rb:5:3:5:6 | puts | exit.rb:5:3:5:15 | MethodCall | semmle.label | successor |
199186
| exit.rb:5:3:5:15 | MethodCall | exit.rb:1:1:6:3 | exit m1 (normal) | semmle.label | successor |
200-
| exit.rb:5:3:5:15 | MethodCall | exit.rb:9:3:11:5 | If | semmle.label | successor |
201187
| exit.rb:5:8:5:15 | String | exit.rb:5:3:5:6 | puts | semmle.label | successor |
202188
| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | If | semmle.label | successor |
203189
| exit.rb:8:1:13:3 | exit m2 (abnormal) | exit.rb:8:1:13:3 | exit m2 | semmle.label | successor |
@@ -208,24 +194,20 @@ edges
208194
| exit.rb:9:6:9:10 | Binary | exit.rb:12:8:12:15 | String | semmle.label | false |
209195
| exit.rb:9:10:9:10 | 2 | exit.rb:9:6:9:10 | Binary | semmle.label | successor |
210196
| exit.rb:10:5:10:9 | abort | exit.rb:10:5:10:18 | MethodCall | semmle.label | successor |
211-
| exit.rb:10:5:10:18 | MethodCall | exit.rb:1:1:13:4 | exit top-level (abnormal) | semmle.label | exit |
212197
| exit.rb:10:5:10:18 | MethodCall | exit.rb:8:1:13:3 | exit m2 (abnormal) | semmle.label | exit |
213198
| exit.rb:10:11:10:18 | String | exit.rb:10:5:10:9 | abort | semmle.label | successor |
214199
| exit.rb:12:3:12:6 | puts | exit.rb:12:3:12:15 | MethodCall | semmle.label | successor |
215200
| exit.rb:12:3:12:15 | MethodCall | exit.rb:8:1:13:3 | exit m2 (normal) | semmle.label | successor |
216201
| exit.rb:12:8:12:15 | String | exit.rb:12:3:12:6 | puts | semmle.label | successor |
217202
| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:2:3:8:5 | If | semmle.label | successor |
218203
| ifs.rb:1:1:9:3 | exit m1 (normal) | ifs.rb:1:1:9:3 | exit m1 | semmle.label | successor |
219-
| ifs.rb:1:1:26:4 | enter top-level | ifs.rb:2:3:8:5 | If | semmle.label | successor |
220-
| ifs.rb:1:1:26:4 | exit top-level (normal) | ifs.rb:1:1:26:4 | exit top-level | semmle.label | successor |
221204
| ifs.rb:2:3:8:5 | If | ifs.rb:2:6:2:6 | x | semmle.label | successor |
222205
| ifs.rb:2:6:2:6 | x | ifs.rb:2:10:2:10 | 2 | semmle.label | successor |
223206
| ifs.rb:2:6:2:10 | Binary | ifs.rb:3:10:3:30 | String | semmle.label | true |
224207
| ifs.rb:2:6:2:10 | Binary | ifs.rb:4:3:7:35 | Elsif | semmle.label | false |
225208
| ifs.rb:2:10:2:10 | 2 | ifs.rb:2:6:2:10 | Binary | semmle.label | successor |
226209
| ifs.rb:3:5:3:8 | puts | ifs.rb:3:5:3:30 | MethodCall | semmle.label | successor |
227210
| ifs.rb:3:5:3:30 | MethodCall | ifs.rb:1:1:9:3 | exit m1 (normal) | semmle.label | successor |
228-
| ifs.rb:3:5:3:30 | MethodCall | ifs.rb:12:3:14:5 | If | semmle.label | successor |
229211
| ifs.rb:3:10:3:30 | String | ifs.rb:3:5:3:8 | puts | semmle.label | successor |
230212
| ifs.rb:4:3:7:35 | Elsif | ifs.rb:4:9:4:9 | x | semmle.label | successor |
231213
| ifs.rb:4:9:4:9 | x | ifs.rb:4:14:4:14 | 2 | semmle.label | successor |
@@ -250,21 +232,17 @@ edges
250232
| ifs.rb:4:37:4:37 | 5 | ifs.rb:4:32:4:37 | Binary | semmle.label | successor |
251233
| ifs.rb:5:5:5:8 | puts | ifs.rb:5:5:5:17 | MethodCall | semmle.label | successor |
252234
| ifs.rb:5:5:5:17 | MethodCall | ifs.rb:1:1:9:3 | exit m1 (normal) | semmle.label | successor |
253-
| ifs.rb:5:5:5:17 | MethodCall | ifs.rb:12:3:14:5 | If | semmle.label | successor |
254235
| ifs.rb:5:10:5:17 | String | ifs.rb:5:5:5:8 | puts | semmle.label | successor |
255236
| ifs.rb:7:5:7:8 | puts | ifs.rb:7:5:7:35 | MethodCall | semmle.label | successor |
256237
| ifs.rb:7:5:7:35 | MethodCall | ifs.rb:1:1:9:3 | exit m1 (normal) | semmle.label | successor |
257-
| ifs.rb:7:5:7:35 | MethodCall | ifs.rb:12:3:14:5 | If | semmle.label | successor |
258238
| ifs.rb:7:10:7:35 | String | ifs.rb:7:5:7:8 | puts | semmle.label | successor |
259239
| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | If | semmle.label | successor |
260240
| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 | semmle.label | successor |
261241
| ifs.rb:12:3:14:5 | If | ifs.rb:12:6:12:6 | b | semmle.label | successor |
262242
| ifs.rb:12:6:12:6 | b | ifs.rb:13:12:13:12 | 0 | semmle.label | true |
263243
| ifs.rb:12:6:12:6 | b | ifs.rb:15:10:15:10 | 1 | semmle.label | false |
264-
| ifs.rb:13:5:13:12 | Return | ifs.rb:1:1:26:4 | exit top-level (normal) | semmle.label | return |
265244
| ifs.rb:13:5:13:12 | Return | ifs.rb:11:1:16:3 | exit m2 (normal) | semmle.label | return |
266245
| ifs.rb:13:12:13:12 | 0 | ifs.rb:13:5:13:12 | Return | semmle.label | successor |
267-
| ifs.rb:15:3:15:10 | Return | ifs.rb:1:1:26:4 | exit top-level (normal) | semmle.label | return |
268246
| ifs.rb:15:3:15:10 | Return | ifs.rb:11:1:16:3 | exit m2 (normal) | semmle.label | return |
269247
| ifs.rb:15:10:15:10 | 1 | ifs.rb:15:3:15:10 | Return | semmle.label | successor |
270248
| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:19:3:24:5 | If | semmle.label | successor |
@@ -293,12 +271,10 @@ edges
293271
| ifs.rb:25:8:25:8 | x | ifs.rb:25:3:25:6 | puts | semmle.label | successor |
294272
| loops.rb:1:1:6:3 | enter m1 | loops.rb:2:3:5:5 | While | semmle.label | successor |
295273
| loops.rb:1:1:6:3 | exit m1 (normal) | loops.rb:1:1:6:3 | exit m1 | semmle.label | successor |
296-
| loops.rb:1:1:28:3 | enter top-level | loops.rb:2:3:5:5 | While | semmle.label | successor |
297274
| loops.rb:2:3:5:5 | While | loops.rb:2:9:2:9 | x | semmle.label | successor |
298275
| loops.rb:2:9:2:9 | x | loops.rb:2:14:2:14 | 0 | semmle.label | successor |
299276
| loops.rb:2:9:2:14 | Binary | loops.rb:1:1:6:3 | exit m1 (normal) | semmle.label | false |
300277
| loops.rb:2:9:2:14 | Binary | loops.rb:3:10:3:10 | x | semmle.label | true |
301-
| loops.rb:2:9:2:14 | Binary | loops.rb:9:3:20:5 | While | semmle.label | false |
302278
| loops.rb:2:14:2:14 | 0 | loops.rb:2:9:2:14 | Binary | semmle.label | successor |
303279
| loops.rb:3:5:3:8 | puts | loops.rb:3:5:3:10 | MethodCall | semmle.label | successor |
304280
| loops.rb:3:5:3:10 | MethodCall | loops.rb:4:5:4:5 | x | semmle.label | successor |
@@ -342,7 +318,6 @@ edges
342318
| loops.rb:19:10:19:15 | String | loops.rb:19:5:19:8 | puts | semmle.label | successor |
343319
| loops.rb:21:3:21:6 | puts | loops.rb:21:3:21:13 | MethodCall | semmle.label | successor |
344320
| loops.rb:21:3:21:13 | MethodCall | loops.rb:8:1:22:3 | exit m2 (normal) | semmle.label | successor |
345-
| loops.rb:21:3:21:13 | MethodCall | loops.rb:25:4:25:4 | 1 | semmle.label | successor |
346321
| loops.rb:21:8:21:13 | String | loops.rb:21:3:21:6 | puts | semmle.label | successor |
347322
| loops.rb:24:1:28:3 | enter m3 | loops.rb:25:4:25:4 | 1 | semmle.label | successor |
348323
| loops.rb:24:1:28:3 | exit m3 (normal) | loops.rb:24:1:28:3 | exit m3 | semmle.label | successor |
@@ -361,16 +336,13 @@ edges
361336
| raise.rb:1:1:6:3 | enter m1 | raise.rb:2:3:4:5 | If | semmle.label | successor |
362337
| raise.rb:1:1:6:3 | exit m1 (abnormal) | raise.rb:1:1:6:3 | exit m1 | semmle.label | successor |
363338
| raise.rb:1:1:6:3 | exit m1 (normal) | raise.rb:1:1:6:3 | exit m1 | semmle.label | successor |
364-
| raise.rb:1:1:6:4 | enter top-level | raise.rb:2:3:4:5 | If | semmle.label | successor |
365-
| raise.rb:1:1:6:4 | exit top-level (abnormal) | raise.rb:1:1:6:4 | exit top-level | semmle.label | successor |
366339
| raise.rb:2:3:4:5 | If | raise.rb:2:6:2:6 | x | semmle.label | successor |
367340
| raise.rb:2:6:2:6 | x | raise.rb:2:10:2:10 | 2 | semmle.label | successor |
368341
| raise.rb:2:6:2:10 | Binary | raise.rb:3:11:3:17 | String | semmle.label | true |
369342
| raise.rb:2:6:2:10 | Binary | raise.rb:5:8:5:15 | String | semmle.label | false |
370343
| raise.rb:2:10:2:10 | 2 | raise.rb:2:6:2:10 | Binary | semmle.label | successor |
371344
| raise.rb:3:5:3:9 | raise | raise.rb:3:5:3:17 | MethodCall | semmle.label | successor |
372345
| raise.rb:3:5:3:17 | MethodCall | raise.rb:1:1:6:3 | exit m1 (abnormal) | semmle.label | raise |
373-
| raise.rb:3:5:3:17 | MethodCall | raise.rb:1:1:6:4 | exit top-level (abnormal) | semmle.label | raise |
374346
| raise.rb:3:11:3:17 | String | raise.rb:3:5:3:9 | raise | semmle.label | successor |
375347
| raise.rb:5:3:5:6 | puts | raise.rb:5:3:5:15 | MethodCall | semmle.label | successor |
376348
| raise.rb:5:3:5:15 | MethodCall | raise.rb:1:1:6:3 | exit m1 (normal) | semmle.label | successor |

0 commit comments

Comments
 (0)