Skip to content

Commit c35283c

Browse files
authored
Merge pull request #77 from github/aibaars/global-variables
Add global variables
2 parents f0ddeaa + ad1782b commit c35283c

File tree

6 files changed

+86
-24
lines changed

6 files changed

+86
-24
lines changed

ql/src/codeql_ruby/ast/Variable.qll

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -53,30 +53,47 @@ class Variable extends TVariable {
5353
}
5454

5555
/** A local variable. */
56-
class LocalVariable extends Variable {
56+
class LocalVariable extends Variable, TLocalVariable {
5757
override LocalVariable::Range range;
5858

5959
final override LocalVariableAccess getAnAccess() { result.getVariable() = this }
6060
}
6161

62+
/** A global variable. */
63+
class GlobalVariable extends Variable, TGlobalVariable {
64+
override GlobalVariable::Range range;
65+
66+
final override GlobalVariableAccess getAnAccess() { result.getVariable() = this }
67+
}
68+
6269
/** An access to a variable. */
63-
class VariableAccess extends Expr, @token_identifier {
70+
class VariableAccess extends Expr {
6471
override VariableAccess::Range range;
6572

6673
/** Gets the variable this identifier refers to. */
6774
Variable getVariable() { result = range.getVariable() }
6875

6976
final override string toString() { result = this.getVariable().getName() }
70-
// TODO uncomment this and fix the params test
71-
//override string getAPrimaryQlClass() { result = "VariableAccess" }
7277
}
7378

7479
/** An access to a local variable. */
75-
class LocalVariableAccess extends VariableAccess {
80+
class LocalVariableAccess extends VariableAccess, @token_identifier {
7681
final override LocalVariableAccess::Range range;
7782

7883
/** Gets the variable this identifier refers to. */
7984
final override LocalVariable getVariable() { result = range.getVariable() }
80-
// TODO uncomment this and fix the params test
81-
//final override string getAPrimaryQlClass() { result = "LocalVariableAccess" }
85+
86+
final override string getAPrimaryQlClass() {
87+
not this instanceof SimpleParameter and result = "LocalVariableAccess"
88+
}
89+
}
90+
91+
/** An access to a local variable. */
92+
class GlobalVariableAccess extends VariableAccess, @token_global_variable {
93+
final override GlobalVariableAccess::Range range;
94+
95+
/** Gets the variable this identifier refers to. */
96+
final override GlobalVariable getVariable() { result = range.getVariable() }
97+
98+
final override string getAPrimaryQlClass() { result = "GlobalVariableAccess" }
8299
}

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

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ cached
101101
private module Cached {
102102
cached
103103
newtype TScope =
104+
TGlobalScope() or
104105
TTopLevelScope(Generated::Program node) or
105106
TModuleScope(Generated::Module node) or
106107
TClassScope(AstNode cls) {
@@ -110,6 +111,7 @@ private module Cached {
110111

111112
cached
112113
newtype TVariable =
114+
TGlobalVariable(string name) { name = any(Generated::GlobalVariable var).getValue() } or
113115
TLocalVariable(VariableScope scope, string name, Generated::Identifier i) {
114116
scopeDefinesParameterVariable(scope, name, i)
115117
or
@@ -153,6 +155,14 @@ module VariableScope {
153155
}
154156
}
155157

158+
module GlobalScope {
159+
class Range extends VariableScope::Range, TGlobalScope {
160+
override string toString() { result = "global scope" }
161+
162+
override AstNode getScopeElement() { none() }
163+
}
164+
}
165+
156166
module TopLevelScope {
157167
class Range extends VariableScope::Range, TTopLevelScope {
158168
override string toString() { result = "top-level scope" }
@@ -211,7 +221,7 @@ module Variable {
211221
}
212222

213223
module LocalVariable {
214-
class Range extends Variable::Range {
224+
class Range extends Variable::Range, TLocalVariable {
215225
private VariableScope scope;
216226
private string name;
217227
private Generated::Identifier i;
@@ -226,21 +236,43 @@ module LocalVariable {
226236
}
227237
}
228238

239+
module GlobalVariable {
240+
class Range extends Variable::Range, TGlobalVariable {
241+
private string name;
242+
243+
Range() { this = TGlobalVariable(name) }
244+
245+
final override string getName() { result = name }
246+
247+
final override Location getLocation() { none() }
248+
249+
final override VariableScope getDeclaringScope() { result = TGlobalScope() }
250+
}
251+
}
252+
229253
module VariableAccess {
230-
class Range extends Expr::Range, @token_identifier {
254+
abstract class Range extends Expr::Range {
255+
abstract Variable getVariable();
256+
}
257+
}
258+
259+
module LocalVariableAccess {
260+
class Range extends VariableAccess::Range, @token_identifier {
231261
override Generated::Identifier generated;
232-
Variable variable;
262+
LocalVariable variable;
233263

234264
Range() { access(this, variable) }
235265

236-
Variable getVariable() { result = variable }
266+
final override LocalVariable getVariable() { result = variable }
237267
}
238268
}
239269

240-
module LocalVariableAccess {
241-
class Range extends VariableAccess::Range {
242-
override LocalVariable variable;
270+
module GlobalVariableAccess {
271+
class Range extends VariableAccess::Range, @token_global_variable {
272+
GlobalVariable variable;
273+
274+
Range() { this.(Generated::GlobalVariable).getValue() = variable.getName() }
243275

244-
override LocalVariable getVariable() { result = variable }
276+
final override GlobalVariable getVariable() { result = variable }
245277
}
246278
}

ql/test/library-tests/variables/scopes.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,10 @@ def a ; "x" end
1515
puts b # new local variable
1616
puts c # new local variable
1717
puts d # new local variable
18-
end
18+
end
19+
20+
# new global variable
21+
$global = 42
22+
23+
# use of a pre-defined global variable
24+
script = $0

ql/test/library-tests/variables/varaccess.expected

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,20 @@
7676
| scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | scopes.rb:2:9:6:3 | block scope |
7777
| scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope |
7878
| scopes.rb:5:9:5:9 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope |
79-
| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:18:3 | top-level scope |
80-
| scopes.rb:8:6:8:6 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:18:3 | top-level scope |
79+
| scopes.rb:7:1:7:1 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:24:12 | top-level scope |
80+
| scopes.rb:8:6:8:6 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:24:12 | top-level scope |
8181
| scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | scopes.rb:9:9:18:3 | block scope |
82-
| scopes.rb:10:9:10:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:18:3 | top-level scope |
83-
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:18:3 | top-level scope |
84-
| scopes.rb:12:9:12:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:18:3 | top-level scope |
85-
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:18:3 | top-level scope |
82+
| scopes.rb:10:9:10:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:24:12 | top-level scope |
83+
| scopes.rb:11:4:11:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:24:12 | top-level scope |
84+
| scopes.rb:12:9:12:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:24:12 | top-level scope |
85+
| scopes.rb:13:4:13:4 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:24:12 | top-level scope |
8686
| scopes.rb:13:7:13:7 | b | scopes.rb:13:7:13:7 | b | scopes.rb:9:9:18:3 | block scope |
8787
| scopes.rb:13:11:13:11 | c | scopes.rb:13:11:13:11 | c | scopes.rb:9:9:18:3 | block scope |
8888
| scopes.rb:13:14:13:14 | d | scopes.rb:13:14:13:14 | d | scopes.rb:9:9:18:3 | block scope |
89-
| scopes.rb:14:9:14:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:18:3 | top-level scope |
89+
| scopes.rb:14:9:14:9 | a | scopes.rb:7:1:7:1 | a | scopes.rb:1:1:24:12 | top-level scope |
9090
| scopes.rb:15:9:15:9 | b | scopes.rb:13:7:13:7 | b | scopes.rb:9:9:18:3 | block scope |
9191
| scopes.rb:16:9:16:9 | c | scopes.rb:13:11:13:11 | c | scopes.rb:9:9:18:3 | block scope |
9292
| scopes.rb:17:9:17:9 | d | scopes.rb:13:14:13:14 | d | scopes.rb:9:9:18:3 | block scope |
93+
| scopes.rb:21:1:21:7 | $global | file://:0:0:0:0 | $global | file://:0:0:0:0 | global scope |
94+
| scopes.rb:24:1:24:6 | script | scopes.rb:24:1:24:6 | script | scopes.rb:1:1:24:12 | top-level scope |
95+
| scopes.rb:24:10:24:11 | $0 | file://:0:0:0:0 | $0 | file://:0:0:0:0 | global scope |

ql/test/library-tests/variables/variable.expected

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
| file://:0:0:0:0 | $0 |
2+
| file://:0:0:0:0 | $global |
13
| nested_scopes.rb:5:3:5:3 | a |
24
| nested_scopes.rb:7:5:7:5 | a |
35
| nested_scopes.rb:9:7:9:7 | a |
@@ -40,3 +42,4 @@
4042
| scopes.rb:13:7:13:7 | b |
4143
| scopes.rb:13:11:13:11 | c |
4244
| scopes.rb:13:14:13:14 | d |
45+
| scopes.rb:24:1:24:6 | script |

ql/test/library-tests/variables/varscopes.expected

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
| file://:0:0:0:0 | global scope |
12
| nested_scopes.rb:1:1:3:3 | method scope |
23
| nested_scopes.rb:1:1:42:1 | top-level scope |
34
| nested_scopes.rb:4:1:39:3 | class scope |
@@ -25,6 +26,6 @@
2526
| parameters.rb:49:1:51:3 | method scope |
2627
| parameters.rb:54:9:57:3 | block scope |
2728
| scopes.rb:1:1:1:15 | method scope |
28-
| scopes.rb:1:1:18:3 | top-level scope |
29+
| scopes.rb:1:1:24:12 | top-level scope |
2930
| scopes.rb:2:9:6:3 | block scope |
3031
| scopes.rb:9:9:18:3 | block scope |

0 commit comments

Comments
 (0)