Skip to content

Commit 135ee0d

Browse files
committed
Ruby: Add implicit writes for synthesized parameters
1 parent 028ef6f commit 135ee0d

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

ruby/ql/lib/codeql/ruby/ast/Parameter.qll

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@ class NamedParameter extends Parameter, TNamedParameter {
5757
final VariableAccess getAnAccess() { result = this.getVariable().getAnAccess() }
5858

5959
/** Gets the access that defines the underlying local variable. */
60-
final VariableAccess getDefiningAccess() { result = this.getVariable().getDefiningAccess() }
60+
final VariableAccess getDefiningAccess() {
61+
result = this.getVariable().getDefiningAccess()
62+
or
63+
result = this.(SimpleParameterSynthImpl).getDefininingAccess()
64+
}
6165

6266
override AstNode getAChild(string pred) {
6367
result = super.getAChild(pred)

ruby/ql/lib/codeql/ruby/ast/Variable.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ private import codeql.Locations
55
private import internal.AST
66
private import internal.TreeSitter
77
private import internal.Variable
8+
private import internal.Parameter
89

910
/** A variable declared in a scope. */
1011
class Variable instanceof VariableImpl {
@@ -110,7 +111,11 @@ class VariableAccess extends Expr instanceof VariableAccessImpl {
110111
* the access to `elements` in the parameter list is an implicit assignment,
111112
* as is the first access to `e`.
112113
*/
113-
predicate isImplicitWrite() { implicitWriteAccess(toGenerated(this)) }
114+
predicate isImplicitWrite() {
115+
implicitWriteAccess(toGenerated(this))
116+
or
117+
this = any(SimpleParameterSynthImpl p).getDefininingAccess()
118+
}
114119

115120
final override string toString() { result = VariableAccessImpl.super.toString() }
116121
}

ruby/ql/lib/codeql/ruby/ast/internal/Parameter.qll

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ abstract class SimpleParameterImpl extends AstNode, TSimpleParameter {
2525
abstract string getNameImpl();
2626
}
2727

28-
private class SimpleParameterRealImpl extends SimpleParameterImpl, TSimpleParameterReal {
28+
class SimpleParameterRealImpl extends SimpleParameterImpl, TSimpleParameterReal {
2929
private Ruby::Identifier g;
3030

3131
SimpleParameterRealImpl() { this = TSimpleParameterReal(g) }
@@ -35,9 +35,11 @@ private class SimpleParameterRealImpl extends SimpleParameterImpl, TSimpleParame
3535
override string getNameImpl() { result = g.getValue() }
3636
}
3737

38-
private class SimpleParameterSynthImpl extends SimpleParameterImpl, TSimpleParameterSynth {
38+
class SimpleParameterSynthImpl extends SimpleParameterImpl, TSimpleParameterSynth {
3939
SimpleParameterSynthImpl() { this = TSimpleParameterSynth(_, _) }
4040

41+
LocalVariableAccessSynth getDefininingAccess() { synthChild(this, 0, result) }
42+
4143
override LocalVariable getVariableImpl() { result = TLocalVariableSynth(this, _) }
4244

4345
override string getNameImpl() { result = this.getVariableImpl().getName() }

0 commit comments

Comments
 (0)