Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 30cb2cc

Browse files
committed
CFG: add more CfgScopeRanges
1 parent e181666 commit 30cb2cc

3 files changed

Lines changed: 87 additions & 1 deletion

File tree

ql/src/codeql_ruby/controlflow/ControlFlowGraph.qll

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,34 @@ private import internal.ControlFlowGraphImpl
77
private import internal.Splitting
88
private import internal.Completion
99

10-
private class CfgScopeRange = @method or @block or @do_block;
10+
private class CfgScopeRange =
11+
@program or @begin_block or @end_block or @module or @class or @singleton_class or @method or
12+
@singleton_method or @block or @do_block;
1113

1214
/** An AST node with an associated control-flow graph. */
1315
class CfgScope extends AstNode, CfgScopeRange {
1416
/** Gets the name of this scope. */
1517
string getName() {
18+
this instanceof Program and
19+
result = "top-level"
20+
or
21+
this instanceof BeginBlock and
22+
result = "BEGIN block"
23+
or
24+
this instanceof EndBlock and
25+
result = "END block"
26+
or
27+
result = this.(Module).getName().toString()
28+
or
29+
result = this.(Class).getName().toString()
30+
or
31+
this instanceof SingletonClass and
32+
result = "singleton class"
33+
or
1634
result = this.(Method).getName().toString()
1735
or
36+
result = this.(SingletonMethod).getName().toString()
37+
or
1838
this instanceof Block and
1939
result = "block"
2040
or

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ private module Trees {
246246
}
247247
}
248248

249+
private class BeginBlockTree extends StandardPreOrderTree, BeginBlock {
250+
final override AstNode getChildNode(int i) { result = this.getChild(i) }
251+
}
252+
249253
private class BinaryTree extends StandardPostOrderTree, Binary {
250254
BinaryTree() { not this instanceof LogicalAndAstNode and not this instanceof LogicalOrAstNode }
251255

@@ -272,6 +276,12 @@ private module Trees {
272276
}
273277
}
274278

279+
private class ClassTree extends StandardPreOrderTree, Class {
280+
final override AstNode getChildNode(int i) { result = this.getChild(i) }
281+
282+
override predicate isHidden() { any() }
283+
}
284+
275285
private class DoTree extends StandardPreOrderTree, Do {
276286
final override AstNode getChildNode(int i) { result = this.getChild(i) }
277287

@@ -290,6 +300,10 @@ private module Trees {
290300
override predicate isHidden() { any() }
291301
}
292302

303+
private class EndBlockTree extends StandardPreOrderTree, EndBlock {
304+
final override AstNode getChildNode(int i) { result = this.getChild(i) }
305+
}
306+
293307
private class IdentifierTree extends LeafTree, Identifier { }
294308

295309
private class IfElsifTree extends PreOrderTree, IfElsifAstNode {
@@ -392,6 +406,12 @@ private module Trees {
392406
}
393407
}
394408

409+
private class ModuleTree extends StandardPreOrderTree, Module {
410+
final override AstNode getChildNode(int i) { result = this.getChild(i) }
411+
412+
override predicate isHidden() { any() }
413+
}
414+
395415
private class NextTree extends StandardPostOrderTree, Next {
396416
final override AstNode getChildNode(int i) { result = this.getChild() and i = 0 }
397417
}
@@ -408,6 +428,12 @@ private module Trees {
408428
final override AstNode getChildNode(int i) { result = this.getChild(i) }
409429
}
410430

431+
private class ProgramTree extends StandardPostOrderTree, Program {
432+
final override AstNode getChildNode(int i) { result = this.getChild(i) }
433+
434+
override predicate isHidden() { any() }
435+
}
436+
411437
private class RedoTree extends StandardPostOrderTree, Redo {
412438
final override AstNode getChildNode(int i) { result = this.getChild() and i = 0 }
413439
}
@@ -416,6 +442,18 @@ private module Trees {
416442
final override AstNode getChildNode(int i) { result = this.getChild() and i = 0 }
417443
}
418444

445+
private class SingletonClassTree extends StandardPreOrderTree, SingletonClass {
446+
final override AstNode getChildNode(int i) { result = this.getChild(i) }
447+
448+
override predicate isHidden() { any() }
449+
}
450+
451+
private class SingletonMethodTree extends StandardPreOrderTree, SingletonMethod {
452+
final override AstNode getChildNode(int i) { result = this.getChild(i) }
453+
454+
override predicate isHidden() { any() }
455+
}
456+
419457
private class StringTree extends LeafTree, String { }
420458

421459
private class ThenTree extends StandardPreOrderTree, Then {

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

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ 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) |
69
| exit.rb:2:3:4:5 | If |
710
| exit.rb:2:6:2:6 | x |
811
| exit.rb:2:6:2:10 | Binary |
@@ -30,6 +33,9 @@ nodes
3033
| ifs.rb:1:1:9:3 | enter m1 |
3134
| ifs.rb:1:1:9:3 | exit m1 |
3235
| 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) |
3339
| ifs.rb:2:3:8:5 | If |
3440
| ifs.rb:2:6:2:6 | x |
3541
| ifs.rb:2:6:2:10 | Binary |
@@ -96,6 +102,7 @@ nodes
96102
| loops.rb:1:1:6:3 | enter m1 |
97103
| loops.rb:1:1:6:3 | exit m1 |
98104
| loops.rb:1:1:6:3 | exit m1 (normal) |
105+
| loops.rb:1:1:28:3 | enter top-level |
99106
| loops.rb:2:3:5:5 | While |
100107
| loops.rb:2:9:2:9 | x |
101108
| loops.rb:2:9:2:14 | Binary |
@@ -160,6 +167,9 @@ nodes
160167
| raise.rb:1:1:6:3 | exit m1 |
161168
| raise.rb:1:1:6:3 | exit m1 (abnormal) |
162169
| 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) |
163173
| raise.rb:2:3:4:5 | If |
164174
| raise.rb:2:6:2:6 | x |
165175
| raise.rb:2:6:2:10 | Binary |
@@ -174,16 +184,20 @@ edges
174184
| exit.rb:1:1:6:3 | enter m1 | exit.rb:2:3:4:5 | If | semmle.label | successor |
175185
| exit.rb:1:1:6:3 | exit m1 (abnormal) | exit.rb:1:1:6:3 | exit m1 | semmle.label | successor |
176186
| 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 |
177189
| exit.rb:2:3:4:5 | If | exit.rb:2:6:2:6 | x | semmle.label | successor |
178190
| exit.rb:2:6:2:6 | x | exit.rb:2:10:2:10 | 2 | semmle.label | successor |
179191
| exit.rb:2:6:2:10 | Binary | exit.rb:3:10:3:10 | 1 | semmle.label | true |
180192
| exit.rb:2:6:2:10 | Binary | exit.rb:5:8:5:15 | String | semmle.label | false |
181193
| exit.rb:2:10:2:10 | 2 | exit.rb:2:6:2:10 | Binary | semmle.label | successor |
182194
| exit.rb:3:5:3:8 | exit | exit.rb:3:5:3:10 | MethodCall | semmle.label | successor |
183195
| 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 |
184197
| exit.rb:3:10:3:10 | 1 | exit.rb:3:5:3:8 | exit | semmle.label | successor |
185198
| exit.rb:5:3:5:6 | puts | exit.rb:5:3:5:15 | MethodCall | semmle.label | successor |
186199
| 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 |
187201
| exit.rb:5:8:5:15 | String | exit.rb:5:3:5:6 | puts | semmle.label | successor |
188202
| exit.rb:8:1:13:3 | enter m2 | exit.rb:9:3:11:5 | If | semmle.label | successor |
189203
| exit.rb:8:1:13:3 | exit m2 (abnormal) | exit.rb:8:1:13:3 | exit m2 | semmle.label | successor |
@@ -194,20 +208,24 @@ edges
194208
| exit.rb:9:6:9:10 | Binary | exit.rb:12:8:12:15 | String | semmle.label | false |
195209
| exit.rb:9:10:9:10 | 2 | exit.rb:9:6:9:10 | Binary | semmle.label | successor |
196210
| 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 |
197212
| exit.rb:10:5:10:18 | MethodCall | exit.rb:8:1:13:3 | exit m2 (abnormal) | semmle.label | exit |
198213
| exit.rb:10:11:10:18 | String | exit.rb:10:5:10:9 | abort | semmle.label | successor |
199214
| exit.rb:12:3:12:6 | puts | exit.rb:12:3:12:15 | MethodCall | semmle.label | successor |
200215
| exit.rb:12:3:12:15 | MethodCall | exit.rb:8:1:13:3 | exit m2 (normal) | semmle.label | successor |
201216
| exit.rb:12:8:12:15 | String | exit.rb:12:3:12:6 | puts | semmle.label | successor |
202217
| ifs.rb:1:1:9:3 | enter m1 | ifs.rb:2:3:8:5 | If | semmle.label | successor |
203218
| 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 |
204221
| ifs.rb:2:3:8:5 | If | ifs.rb:2:6:2:6 | x | semmle.label | successor |
205222
| ifs.rb:2:6:2:6 | x | ifs.rb:2:10:2:10 | 2 | semmle.label | successor |
206223
| ifs.rb:2:6:2:10 | Binary | ifs.rb:3:10:3:30 | String | semmle.label | true |
207224
| ifs.rb:2:6:2:10 | Binary | ifs.rb:4:3:7:35 | Elsif | semmle.label | false |
208225
| ifs.rb:2:10:2:10 | 2 | ifs.rb:2:6:2:10 | Binary | semmle.label | successor |
209226
| ifs.rb:3:5:3:8 | puts | ifs.rb:3:5:3:30 | MethodCall | semmle.label | successor |
210227
| 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 |
211229
| ifs.rb:3:10:3:30 | String | ifs.rb:3:5:3:8 | puts | semmle.label | successor |
212230
| ifs.rb:4:3:7:35 | Elsif | ifs.rb:4:9:4:9 | x | semmle.label | successor |
213231
| ifs.rb:4:9:4:9 | x | ifs.rb:4:14:4:14 | 2 | semmle.label | successor |
@@ -232,17 +250,21 @@ edges
232250
| ifs.rb:4:37:4:37 | 5 | ifs.rb:4:32:4:37 | Binary | semmle.label | successor |
233251
| ifs.rb:5:5:5:8 | puts | ifs.rb:5:5:5:17 | MethodCall | semmle.label | successor |
234252
| 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 |
235254
| ifs.rb:5:10:5:17 | String | ifs.rb:5:5:5:8 | puts | semmle.label | successor |
236255
| ifs.rb:7:5:7:8 | puts | ifs.rb:7:5:7:35 | MethodCall | semmle.label | successor |
237256
| 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 |
238258
| ifs.rb:7:10:7:35 | String | ifs.rb:7:5:7:8 | puts | semmle.label | successor |
239259
| ifs.rb:11:1:16:3 | enter m2 | ifs.rb:12:3:14:5 | If | semmle.label | successor |
240260
| ifs.rb:11:1:16:3 | exit m2 (normal) | ifs.rb:11:1:16:3 | exit m2 | semmle.label | successor |
241261
| ifs.rb:12:3:14:5 | If | ifs.rb:12:6:12:6 | b | semmle.label | successor |
242262
| ifs.rb:12:6:12:6 | b | ifs.rb:13:12:13:12 | 0 | semmle.label | true |
243263
| 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 |
244265
| ifs.rb:13:5:13:12 | Return | ifs.rb:11:1:16:3 | exit m2 (normal) | semmle.label | return |
245266
| 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 |
246268
| ifs.rb:15:3:15:10 | Return | ifs.rb:11:1:16:3 | exit m2 (normal) | semmle.label | return |
247269
| ifs.rb:15:10:15:10 | 1 | ifs.rb:15:3:15:10 | Return | semmle.label | successor |
248270
| ifs.rb:18:1:26:3 | enter m3 | ifs.rb:19:3:24:5 | If | semmle.label | successor |
@@ -271,10 +293,12 @@ edges
271293
| ifs.rb:25:8:25:8 | x | ifs.rb:25:3:25:6 | puts | semmle.label | successor |
272294
| loops.rb:1:1:6:3 | enter m1 | loops.rb:2:3:5:5 | While | semmle.label | successor |
273295
| 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 |
274297
| loops.rb:2:3:5:5 | While | loops.rb:2:9:2:9 | x | semmle.label | successor |
275298
| loops.rb:2:9:2:9 | x | loops.rb:2:14:2:14 | 0 | semmle.label | successor |
276299
| loops.rb:2:9:2:14 | Binary | loops.rb:1:1:6:3 | exit m1 (normal) | semmle.label | false |
277300
| 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 |
278302
| loops.rb:2:14:2:14 | 0 | loops.rb:2:9:2:14 | Binary | semmle.label | successor |
279303
| loops.rb:3:5:3:8 | puts | loops.rb:3:5:3:10 | MethodCall | semmle.label | successor |
280304
| loops.rb:3:5:3:10 | MethodCall | loops.rb:4:5:4:5 | x | semmle.label | successor |
@@ -318,6 +342,7 @@ edges
318342
| loops.rb:19:10:19:15 | String | loops.rb:19:5:19:8 | puts | semmle.label | successor |
319343
| loops.rb:21:3:21:6 | puts | loops.rb:21:3:21:13 | MethodCall | semmle.label | successor |
320344
| 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 |
321346
| loops.rb:21:8:21:13 | String | loops.rb:21:3:21:6 | puts | semmle.label | successor |
322347
| loops.rb:24:1:28:3 | enter m3 | loops.rb:25:4:25:4 | 1 | semmle.label | successor |
323348
| loops.rb:24:1:28:3 | exit m3 (normal) | loops.rb:24:1:28:3 | exit m3 | semmle.label | successor |
@@ -336,13 +361,16 @@ edges
336361
| raise.rb:1:1:6:3 | enter m1 | raise.rb:2:3:4:5 | If | semmle.label | successor |
337362
| raise.rb:1:1:6:3 | exit m1 (abnormal) | raise.rb:1:1:6:3 | exit m1 | semmle.label | successor |
338363
| 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 |
339366
| raise.rb:2:3:4:5 | If | raise.rb:2:6:2:6 | x | semmle.label | successor |
340367
| raise.rb:2:6:2:6 | x | raise.rb:2:10:2:10 | 2 | semmle.label | successor |
341368
| raise.rb:2:6:2:10 | Binary | raise.rb:3:11:3:17 | String | semmle.label | true |
342369
| raise.rb:2:6:2:10 | Binary | raise.rb:5:8:5:15 | String | semmle.label | false |
343370
| raise.rb:2:10:2:10 | 2 | raise.rb:2:6:2:10 | Binary | semmle.label | successor |
344371
| raise.rb:3:5:3:9 | raise | raise.rb:3:5:3:17 | MethodCall | semmle.label | successor |
345372
| 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 |
346374
| raise.rb:3:11:3:17 | String | raise.rb:3:5:3:9 | raise | semmle.label | successor |
347375
| raise.rb:5:3:5:6 | puts | raise.rb:5:3:5:15 | MethodCall | semmle.label | successor |
348376
| raise.rb:5:3:5:15 | MethodCall | raise.rb:1:1:6:3 | exit m1 (normal) | semmle.label | successor |

0 commit comments

Comments
 (0)