Skip to content

Commit b9b4325

Browse files
committed
Add initial mapping of CFG nodes to AST nodes
1 parent edc6e7e commit b9b4325

File tree

15 files changed

+261
-165
lines changed

15 files changed

+261
-165
lines changed

ql/consistency-queries/SsaConsistency.ql

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@ import codeql_ruby.dataflow.SSA
33
import codeql_ruby.controlflow.ControlFlowGraph
44

55
query predicate nonUniqueDef(CfgNode read, Ssa::Definition def) {
6-
read = def.getARead(_) and
7-
exists(Ssa::Definition other | read = other.getARead(_) and other != def)
6+
read = def.getARead() and
7+
exists(Ssa::Definition other | read = other.getARead() and other != def)
88
}
99

1010
query predicate readWithoutDef(LocalVariableReadAccess read) {
1111
exists(CfgNode node |
1212
node = read.getAControlFlowNode() and
13-
not node = any(Ssa::Definition def).getARead(_)
13+
not node = any(Ssa::Definition def).getARead()
1414
)
1515
}
1616

1717
query predicate deadDef(Ssa::Definition def, LocalVariable v) {
1818
v = def.getSourceVariable() and
1919
not v.isCaptured() and
20-
not exists(def.getARead(_)) and
20+
not exists(def.getARead()) and
2121
not def = any(Ssa::PhiNode phi).getAnInput()
2222
}

ql/src/codeql_ruby/CFG.qll

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
/** Provides classes representing the control flow graph. */
2+
3+
import controlflow.ControlFlowGraph
4+
import controlflow.CfgNodes as CfgNodes
5+
import controlflow.BasicBlocks

ql/src/codeql_ruby/ast/Expr.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
private import codeql_ruby.AST
2-
private import codeql_ruby.controlflow.ControlFlowGraph
2+
private import codeql_ruby.CFG
33
private import internal.Expr
44
private import internal.Variable
55
private import codeql_ruby.controlflow.internal.ControlFlowGraphImpl

ql/src/codeql_ruby/ast/Parameter.qll

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ class Parameter extends AstNode {
2222
final int getPosition() { result = pos }
2323

2424
/** Gets a variable introduced by this parameter. */
25-
Variable getAVariable() { none() }
25+
LocalVariable getAVariable() { none() }
2626

2727
/** Gets the variable named `name` introduced by this parameter. */
28-
final Variable getVariable(string name) {
28+
final LocalVariable getVariable(string name) {
2929
result = this.getAVariable() and
3030
result.getName() = name
3131
}
@@ -37,7 +37,7 @@ class Parameter extends AstNode {
3737
* This includes both simple parameters and tuple parameters.
3838
*/
3939
class PatternParameter extends Parameter, Pattern {
40-
override Variable getAVariable() { result = Pattern.super.getAVariable() }
40+
override LocalVariable getAVariable() { result = Pattern.super.getAVariable() }
4141
}
4242

4343
/** A parameter defined using a tuple pattern. */
@@ -53,9 +53,9 @@ class NamedParameter extends Parameter {
5353
string getName() { none() }
5454

5555
/** Gets the variable introduced by this parameter. */
56-
Variable getVariable() { none() }
56+
LocalVariable getVariable() { none() }
5757

58-
override Variable getAVariable() { result = this.getVariable() }
58+
override LocalVariable getAVariable() { result = this.getVariable() }
5959

6060
/** Gets an access to this parameter. */
6161
final VariableAccess getAnAccess() { result = this.getVariable().getAnAccess() }
@@ -65,9 +65,9 @@ class NamedParameter extends Parameter {
6565
class SimpleParameter extends NamedParameter, PatternParameter, VariablePattern {
6666
final override string getName() { result = range.getVariableName() }
6767

68-
final override Variable getVariable() { result = TLocalVariable(_, _, this) }
68+
final override LocalVariable getVariable() { result = TLocalVariable(_, _, this) }
6969

70-
final override Variable getAVariable() { result = this.getVariable() }
70+
final override LocalVariable getAVariable() { result = this.getVariable() }
7171

7272
final override string getAPrimaryQlClass() { result = "SimpleParameter" }
7373

@@ -85,7 +85,7 @@ class SimpleParameter extends NamedParameter, PatternParameter, VariablePattern
8585
class BlockParameter extends @block_parameter, NamedParameter {
8686
final override Generated::BlockParameter generated;
8787

88-
final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
88+
final override LocalVariable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
8989

9090
final override string getAPrimaryQlClass() { result = "BlockParameter" }
9191

@@ -106,7 +106,7 @@ class BlockParameter extends @block_parameter, NamedParameter {
106106
class HashSplatParameter extends @hash_splat_parameter, NamedParameter {
107107
final override Generated::HashSplatParameter generated;
108108

109-
final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
109+
final override LocalVariable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
110110

111111
final override string getAPrimaryQlClass() { result = "HashSplatParameter" }
112112

@@ -129,7 +129,7 @@ class HashSplatParameter extends @hash_splat_parameter, NamedParameter {
129129
class KeywordParameter extends @keyword_parameter, NamedParameter {
130130
final override Generated::KeywordParameter generated;
131131

132-
final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
132+
final override LocalVariable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
133133

134134
final override string getAPrimaryQlClass() { result = "KeywordParameter" }
135135

@@ -164,7 +164,7 @@ class KeywordParameter extends @keyword_parameter, NamedParameter {
164164
class OptionalParameter extends @optional_parameter, NamedParameter {
165165
final override Generated::OptionalParameter generated;
166166

167-
final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
167+
final override LocalVariable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
168168

169169
final override string getAPrimaryQlClass() { result = "OptionalParameter" }
170170

@@ -191,7 +191,7 @@ class OptionalParameter extends @optional_parameter, NamedParameter {
191191
class SplatParameter extends @splat_parameter, NamedParameter {
192192
final override Generated::SplatParameter generated;
193193

194-
final override Variable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
194+
final override LocalVariable getVariable() { result = TLocalVariable(_, _, generated.getName()) }
195195

196196
final override string getAPrimaryQlClass() { result = "SplatParameter" }
197197

ql/src/codeql_ruby/ast/Variable.qll

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,6 @@ class Variable extends TVariable {
5050

5151
/** Gets an access to this variable. */
5252
VariableAccess getAnAccess() { result.getVariable() = this }
53-
54-
/**
55-
* Gets the access where this variable is first introduced, if any.
56-
*
57-
* Global variables do not have a defining access.
58-
*/
59-
VariableAccess getDefiningAccess() { result = range.getDefiningAccess() }
6053
}
6154

6255
/** A local variable. */
@@ -65,6 +58,9 @@ class LocalVariable extends Variable, TLocalVariable {
6558

6659
final override LocalVariableAccess getAnAccess() { result.getVariable() = this }
6760

61+
/** Gets the access where this local variable is first introduced. */
62+
VariableAccess getDefiningAccess() { result = range.getDefiningAccess() }
63+
6864
/**
6965
* Holds if this variable is captured. For example in
7066
*

ql/src/codeql_ruby/ast/internal/Variable.qll

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -378,8 +378,6 @@ module Variable {
378378
abstract Location getLocation();
379379

380380
abstract VariableScope getDeclaringScope();
381-
382-
abstract VariableAccess getDefiningAccess();
383381
}
384382
}
385383

@@ -397,7 +395,7 @@ module LocalVariable {
397395

398396
final override VariableScope getDeclaringScope() { result = scope }
399397

400-
final override VariableAccess getDefiningAccess() { result = i }
398+
final VariableAccess getDefiningAccess() { result = i }
401399
}
402400
}
403401

@@ -412,8 +410,6 @@ module GlobalVariable {
412410
final override Location getLocation() { none() }
413411

414412
final override VariableScope getDeclaringScope() { result = TGlobalScope() }
415-
416-
final override VariableAccess getDefiningAccess() { none() }
417413
}
418414
}
419415

ql/src/codeql_ruby/controlflow/BasicBlocks.qll

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ private import codeql.Locations
44
private import codeql_ruby.ast.internal.TreeSitter::Generated
55
private import codeql_ruby.controlflow.ControlFlowGraph
66
private import internal.ControlFlowGraphImpl
7+
private import CfgNodes
78
private import SuccessorTypes
89

910
/**
@@ -286,9 +287,7 @@ private module Cached {
286287
private predicate predBB(BasicBlock succ, BasicBlock pred) { succBB(pred, succ) }
287288

288289
/** Holds if `bb` is an exit basic block that represents normal exit. */
289-
private predicate normalExitBB(BasicBlock bb) {
290-
bb.getANode().(CfgNodes::AnnotatedExitNode).isNormal()
291-
}
290+
private predicate normalExitBB(BasicBlock bb) { bb.getANode().(AnnotatedExitNode).isNormal() }
292291

293292
/** Holds if `dom` is an immediate post-dominator of `bb`. */
294293
cached
@@ -313,7 +312,7 @@ private module Cached {
313312
private import Cached
314313

315314
/** Holds if `bb` is an entry basic block. */
316-
private predicate entryBB(BasicBlock bb) { bb.getFirstNode() instanceof CfgNodes::EntryNode }
315+
private predicate entryBB(BasicBlock bb) { bb.getFirstNode() instanceof EntryNode }
317316

318317
/**
319318
* An entry basic block, that is, a basic block whose first node is
@@ -333,7 +332,7 @@ class AnnotatedExitBasicBlock extends BasicBlock {
333332
private boolean normal;
334333

335334
AnnotatedExitBasicBlock() {
336-
exists(CfgNodes::AnnotatedExitNode n |
335+
exists(AnnotatedExitNode n |
337336
n = this.getANode() and
338337
if n.isNormal() then normal = true else normal = false
339338
)
@@ -348,12 +347,10 @@ class AnnotatedExitBasicBlock extends BasicBlock {
348347
* an exit node.
349348
*/
350349
class ExitBasicBlock extends BasicBlock {
351-
ExitBasicBlock() { this.getLastNode() instanceof CfgNodes::ExitNode }
350+
ExitBasicBlock() { this.getLastNode() instanceof ExitNode }
352351
}
353352

354353
private module JoinBlockPredecessors {
355-
private import CfgNodes
356-
357354
private predicate id(AstNode x, AstNode y) { x = y }
358355

359356
private predicate idOf(AstNode x, int y) = equivalenceRelation(id/2)(x, y)

0 commit comments

Comments
 (0)