diff --git a/ql/src/codeql_ruby/Variables.qll b/ql/src/codeql_ruby/Variables.qll index f605e0c272e..d7171c78b53 100644 --- a/ql/src/codeql_ruby/Variables.qll +++ b/ql/src/codeql_ruby/Variables.qll @@ -13,35 +13,50 @@ private VariableScope enclosingScope(AstNode node) { result.getScopeElement() = parent*(node.getParent()) } -private string parameterName(AstNode node) { - result = node.(Identifier).getValue() or - result = node.(SplatParameter).getName().getValue() or - result = node.(HashSplatParameter).getName().getValue() or - result = node.(BlockParameter).getName().getValue() or - result = node.(OptionalParameter).getName().getValue() or - result = node.(KeywordParameter).getName().getValue() or - result = parameterName(node.(DestructuredParameter).getAFieldOrChild()) +/** A parameter. */ +class Parameter extends AstNode { + int position; + VariableScope scope; + + Parameter() { + this = + scope.(BlockScope).getScopeElement().getAFieldOrChild().(BlockParameters).getChild(position) + or + this = + scope.(MethodScope).getScopeElement().getAFieldOrChild().(MethodParameters).getChild(position) + } + + final int getPosition() { result = position } + + final VariableScope getDeclaringScope() { result = scope } + + final ParameterAccess getAnAccess() { result.getParameter() = this } } -/** Holds if `scope` defines `name` as a parameter. */ +private Identifier parameterIdentifier(Parameter p) { + result = p or + result = p.(SplatParameter).getName() or + result = p.(HashSplatParameter).getName() or + result = p.(BlockParameter).getName() or + result = p.(OptionalParameter).getName() or + result = p.(KeywordParameter).getName() or + result = destructuredIdentifier(p.(DestructuredParameter)) +} + +private Identifier destructuredIdentifier(AstNode node) { + result = node or + result = destructuredIdentifier(node.(DestructuredParameter).getAFieldOrChild()) +} + +/** Holds if `scope` defines `name` in its parameter declaration. */ private predicate scopeDefinesParameter(VariableScope scope, string name, Location location) { location = - min(AstNode var | - name = parameterName(var) and - var in [scope - .(BlockScope) - .getScopeElement() - .getAFieldOrChild() - .(BlockParameters) - .getAFieldOrChild(), - scope - .(MethodScope) - .getScopeElement() - .getAFieldOrChild() - .(MethodParameters) - .getAFieldOrChild()] + min(Parameter p, Identifier i | + scope = p.getDeclaringScope() and + i = parameterIdentifier(p) and + name = i.getValue() | - var.getLocation() as loc order by loc.getStartLine(), loc.getStartColumn() + i.getLocation() as loc order by loc.getStartLine(), loc.getStartColumn() ) } @@ -89,10 +104,9 @@ private module Cached { cached newtype TVariable = - TParameter(VariableScope scope, string name, Location location) { - scopeDefinesParameter(scope, name, location) - } or TLocalVariable(VariableScope scope, string name, Location location) { + scopeDefinesParameter(scope, name, location) + or not scopeDefinesParameter(scope, name, _) and not blockScopeInherits(scope, name, _) and location = @@ -158,23 +172,6 @@ class Variable extends TVariable { VariableAccess getAnAccess() { result.getVariable() = this } } -/** A parameter. */ -class Parameter extends Variable { - private VariableScope scope; - private string name; - private Location location; - - Parameter() { this = TParameter(scope, name, location) } - - final override string getName() { result = name } - - final override Location getLocation() { result = location } - - final override VariableScope getDeclaringScope() { result = scope } - - final override ParameterAccess getAnAccess() { result = super.getAnAccess() } -} - /** A local variable. */ class LocalVariable extends Variable { private VariableScope scope; @@ -188,8 +185,6 @@ class LocalVariable extends Variable { final override Location getLocation() { result = location } final override VariableScope getDeclaringScope() { result = scope } - - final override LocalVariableAccess getAnAccess() { result = super.getAnAccess() } } /** An identifier that refers to a variable. */ @@ -206,16 +201,17 @@ class VariableAccess extends Identifier { /** An identifier that refers to a parameter. */ class ParameterAccess extends VariableAccess { - override Parameter variable; + Parameter parameter; - final override Parameter getVariable() { result = variable } -} + ParameterAccess() { + exists(Identifier i | + i = parameterIdentifier(parameter) and + variable.getDeclaringScope() = parameter.getDeclaringScope() and + variable.getLocation() = i.getLocation() + ) + } -/** An identifier that refers to a local variable. */ -class LocalVariableAccess extends VariableAccess { - override LocalVariable variable; - - final override LocalVariable getVariable() { result = super.getVariable() } + final Parameter getParameter() { result = parameter } } /** A top-level scope. */ diff --git a/ql/test/library-tests/variables/parameter.expected b/ql/test/library-tests/variables/parameter.expected new file mode 100644 index 00000000000..1e3167d187d --- /dev/null +++ b/ql/test/library-tests/variables/parameter.expected @@ -0,0 +1,29 @@ +parameter +| nested_scopes.rb:15:23:15:23 | a | nested_scopes.rb:15:23:15:23 | a | +| nested_scopes.rb:16:26:16:26 | x | nested_scopes.rb:16:26:16:26 | x | +| nested_scopes.rb:16:29:16:29 | a | nested_scopes.rb:16:29:16:29 | a | +| nested_scopes.rb:18:26:18:26 | x | nested_scopes.rb:18:26:18:26 | x | +| nested_scopes.rb:22:21:22:21 | a | nested_scopes.rb:22:21:22:21 | a | +| parameters.rb:1:14:1:14 | x | parameters.rb:1:14:1:14 | x | +| parameters.rb:1:18:1:18 | y | parameters.rb:1:18:1:18 | y | +| parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | +| parameters.rb:7:25:7:31 | SplatParameter | parameters.rb:7:26:7:31 | pizzas | +| parameters.rb:15:15:15:19 | HashSplatParameter | parameters.rb:15:17:15:19 | map | +| parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | +| parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | +| parameters.rb:21:16:21:21 | BlockParameter | parameters.rb:21:17:21:21 | block | +| parameters.rb:25:15:25:30 | OptionalParameter | parameters.rb:25:15:25:18 | name | +| parameters.rb:25:33:25:50 | OptionalParameter | parameters.rb:25:33:25:36 | size | +| parameters.rb:30:15:30:20 | KeywordParameter | parameters.rb:30:15:30:19 | first | +| parameters.rb:30:24:30:33 | KeywordParameter | parameters.rb:30:24:30:29 | middle | +| parameters.rb:30:36:30:40 | KeywordParameter | parameters.rb:30:36:30:39 | last | +| parameters.rb:35:11:35:21 | OptionalParameter | parameters.rb:35:11:35:11 | a | +| parameters.rb:40:12:40:19 | KeywordParameter | parameters.rb:40:12:40:12 | d | +| parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | +| parameters.rb:49:12:49:16 | DestructuredParameter | parameters.rb:49:13:49:13 | a | +| parameters.rb:49:12:49:16 | DestructuredParameter | parameters.rb:49:15:49:15 | b | +| parameters.rb:54:14:54:24 | OptionalParameter | parameters.rb:54:14:54:14 | y | +| scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | +| scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | +parameterNoAcess +| parameters.rb:45:22:45:22 | _ | diff --git a/ql/test/library-tests/variables/parameter.ql b/ql/test/library-tests/variables/parameter.ql new file mode 100644 index 00000000000..0c7eec56208 --- /dev/null +++ b/ql/test/library-tests/variables/parameter.ql @@ -0,0 +1,5 @@ +import codeql_ruby.Variables + +query predicate parameter(Parameter p, Variable v) { p.getAnAccess().getVariable() = v } + +query predicate parameterNoAcess(Parameter p) { not exists(p.getAnAccess()) } diff --git a/ql/test/library-tests/variables/varaccess.expected b/ql/test/library-tests/variables/varaccess.expected index 44ae78509d7..afb0bdab854 100644 --- a/ql/test/library-tests/variables/varaccess.expected +++ b/ql/test/library-tests/variables/varaccess.expected @@ -30,51 +30,51 @@ variableAccess | parameters.rb:3:9:3:9 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope | | parameters.rb:4:9:4:9 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | +| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | +| parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | | parameters.rb:9:25:9:30 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | +| parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | | parameters.rb:11:41:11:46 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:15:17:15:19 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope | -| parameters.rb:16:3:16:5 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope | +| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope | +| parameters.rb:16:3:16:5 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope | | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope | | parameters.rb:17:13:17:15 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope | | parameters.rb:17:22:17:26 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope | -| parameters.rb:21:17:21:21 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope | -| parameters.rb:22:3:22:7 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:25:40:25:43 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:26:8:26:11 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:27:8:27:11 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:31:11:31:15 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:31:20:31:25 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:31:30:31:33 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope | +| parameters.rb:22:3:22:7 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope | +| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:25:40:25:43 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:26:8:26:11 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:27:8:27:11 | size | parameters.rb:25:33:25:36 | size | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:31:11:31:15 | first | parameters.rb:30:15:30:19 | first | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:31:20:31:25 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:31:30:31:33 | last | parameters.rb:30:36:30:39 | last | parameters.rb:30:1:32:3 | method scope | | parameters.rb:34:1:34:1 | b | parameters.rb:34:1:34:1 | b | parameters.rb:1:1:58:1 | top-level scope | -| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope | +| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:35:1:38:3 | method scope | | parameters.rb:35:16:35:16 | b | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | method scope | -| parameters.rb:37:11:37:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope | +| parameters.rb:37:11:37:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:35:1:38:3 | method scope | | parameters.rb:37:16:37:16 | b | parameters.rb:35:16:35:16 | b | parameters.rb:35:1:38:3 | method scope | -| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope | +| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:40:1:43:3 | method scope | | parameters.rb:40:15:40:15 | e | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | method scope | -| parameters.rb:42:11:42:11 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope | +| parameters.rb:42:11:42:11 | d | parameters.rb:40:12:40:12 | d | parameters.rb:40:1:43:3 | method scope | | parameters.rb:42:16:42:16 | e | parameters.rb:40:15:40:15 | e | parameters.rb:40:1:43:3 | method scope | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope | | parameters.rb:45:22:45:22 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope | | parameters.rb:46:8:46:8 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope | -| parameters.rb:49:13:49:13 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope | -| parameters.rb:49:15:49:15 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope | -| parameters.rb:50:11:50:11 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope | -| parameters.rb:50:16:50:16 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:50:11:50:11 | a | parameters.rb:49:13:49:13 | a | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:50:16:50:16 | b | parameters.rb:49:15:49:15 | b | parameters.rb:49:1:51:3 | method scope | | parameters.rb:53:1:53:1 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope | -| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope | +| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:54:9:57:3 | block scope | | parameters.rb:54:19:54:19 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope | | parameters.rb:55:9:55:9 | x | parameters.rb:53:1:53:1 | x | parameters.rb:1:1:58:1 | top-level scope | -| parameters.rb:56:9:56:9 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope | +| parameters.rb:56:9:56:9 | y | parameters.rb:54:14:54:14 | y | parameters.rb:54:9:57:3 | block scope | | scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | scopes.rb:2:9:6:3 | block scope | | scopes.rb:4:4:4:4 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope | | scopes.rb:5:9:5:9 | a | scopes.rb:4:4:4:4 | a | scopes.rb:2:9:6:3 | block scope | @@ -101,43 +101,43 @@ parameterAccess | parameters.rb:3:9:3:9 | x | parameters.rb:1:14:1:14 | x | parameters.rb:1:9:5:3 | block scope | | parameters.rb:4:9:4:9 | y | parameters.rb:1:18:1:18 | y | parameters.rb:1:9:5:3 | block scope | | parameters.rb:7:17:7:22 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | +| parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | +| parameters.rb:8:6:8:11 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | | parameters.rb:9:25:9:30 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:25:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | +| parameters.rb:11:14:11:19 | pizzas | parameters.rb:7:26:7:31 | pizzas | parameters.rb:7:1:13:3 | method scope | | parameters.rb:11:41:11:46 | client | parameters.rb:7:17:7:22 | client | parameters.rb:7:1:13:3 | method scope | -| parameters.rb:15:17:15:19 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope | -| parameters.rb:16:3:16:5 | map | parameters.rb:15:15:15:19 | map | parameters.rb:15:1:19:3 | method scope | +| parameters.rb:15:17:15:19 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope | +| parameters.rb:16:3:16:5 | map | parameters.rb:15:17:15:19 | map | parameters.rb:15:1:19:3 | method scope | | parameters.rb:16:16:16:18 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope | | parameters.rb:16:21:16:25 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope | | parameters.rb:17:13:17:15 | key | parameters.rb:16:16:16:18 | key | parameters.rb:16:12:18:5 | block scope | | parameters.rb:17:22:17:26 | value | parameters.rb:16:21:16:25 | value | parameters.rb:16:12:18:5 | block scope | -| parameters.rb:21:17:21:21 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope | -| parameters.rb:22:3:22:7 | block | parameters.rb:21:16:21:21 | block | parameters.rb:21:1:23:3 | method scope | -| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:25:40:25:43 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:26:8:26:11 | name | parameters.rb:25:15:25:30 | name | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:27:8:27:11 | size | parameters.rb:25:33:25:50 | size | parameters.rb:25:1:28:3 | method scope | -| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:31:11:31:15 | first | parameters.rb:30:15:30:20 | first | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:31:20:31:25 | middle | parameters.rb:30:24:30:33 | middle | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:31:30:31:33 | last | parameters.rb:30:36:30:40 | last | parameters.rb:30:1:32:3 | method scope | -| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope | -| parameters.rb:37:11:37:11 | a | parameters.rb:35:11:35:21 | a | parameters.rb:35:1:38:3 | method scope | -| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope | -| parameters.rb:42:11:42:11 | d | parameters.rb:40:12:40:19 | d | parameters.rb:40:1:43:3 | method scope | +| parameters.rb:21:17:21:21 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope | +| parameters.rb:22:3:22:7 | block | parameters.rb:21:17:21:21 | block | parameters.rb:21:1:23:3 | method scope | +| parameters.rb:25:15:25:18 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:25:33:25:36 | size | parameters.rb:25:33:25:36 | size | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:25:40:25:43 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:26:8:26:11 | name | parameters.rb:25:15:25:18 | name | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:27:8:27:11 | size | parameters.rb:25:33:25:36 | size | parameters.rb:25:1:28:3 | method scope | +| parameters.rb:30:15:30:19 | first | parameters.rb:30:15:30:19 | first | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:30:24:30:29 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:30:36:30:39 | last | parameters.rb:30:36:30:39 | last | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:31:11:31:15 | first | parameters.rb:30:15:30:19 | first | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:31:20:31:25 | middle | parameters.rb:30:24:30:29 | middle | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:31:30:31:33 | last | parameters.rb:30:36:30:39 | last | parameters.rb:30:1:32:3 | method scope | +| parameters.rb:35:11:35:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:35:1:38:3 | method scope | +| parameters.rb:37:11:37:11 | a | parameters.rb:35:11:35:11 | a | parameters.rb:35:1:38:3 | method scope | +| parameters.rb:40:12:40:12 | d | parameters.rb:40:12:40:12 | d | parameters.rb:40:1:43:3 | method scope | +| parameters.rb:42:11:42:11 | d | parameters.rb:40:12:40:12 | d | parameters.rb:40:1:43:3 | method scope | | parameters.rb:45:20:45:20 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope | | parameters.rb:45:22:45:22 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope | | parameters.rb:46:8:46:8 | _ | parameters.rb:45:20:45:20 | _ | parameters.rb:45:1:47:3 | method scope | -| parameters.rb:49:13:49:13 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope | -| parameters.rb:49:15:49:15 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope | -| parameters.rb:50:11:50:11 | a | parameters.rb:49:12:49:16 | a | parameters.rb:49:1:51:3 | method scope | -| parameters.rb:50:16:50:16 | b | parameters.rb:49:12:49:16 | b | parameters.rb:49:1:51:3 | method scope | -| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope | -| parameters.rb:56:9:56:9 | y | parameters.rb:54:14:54:24 | y | parameters.rb:54:9:57:3 | block scope | +| parameters.rb:49:13:49:13 | a | parameters.rb:49:13:49:13 | a | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:49:15:49:15 | b | parameters.rb:49:15:49:15 | b | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:50:11:50:11 | a | parameters.rb:49:13:49:13 | a | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:50:16:50:16 | b | parameters.rb:49:15:49:15 | b | parameters.rb:49:1:51:3 | method scope | +| parameters.rb:54:14:54:14 | y | parameters.rb:54:14:54:14 | y | parameters.rb:54:9:57:3 | block scope | +| parameters.rb:56:9:56:9 | y | parameters.rb:54:14:54:14 | y | parameters.rb:54:9:57:3 | block scope | | scopes.rb:2:14:2:14 | x | scopes.rb:2:14:2:14 | x | scopes.rb:2:9:6:3 | block scope | | scopes.rb:9:14:9:14 | x | scopes.rb:9:14:9:14 | x | scopes.rb:9:9:13:3 | block scope | localVariableAccess diff --git a/ql/test/library-tests/variables/varaccess.ql b/ql/test/library-tests/variables/varaccess.ql index 911b81f147e..6d428bdf4e6 100644 --- a/ql/test/library-tests/variables/varaccess.ql +++ b/ql/test/library-tests/variables/varaccess.ql @@ -5,14 +5,15 @@ query predicate variableAccess(VariableAccess access, Variable variable, Variabl scope = variable.getDeclaringScope() } -query predicate parameterAccess(ParameterAccess access, Parameter variable, VariableScope scope) { +query predicate parameterAccess(ParameterAccess access, LocalVariable variable, VariableScope scope) { variable = access.getVariable() and scope = variable.getDeclaringScope() } query predicate localVariableAccess( - LocalVariableAccess access, LocalVariable variable, VariableScope scope + VariableAccess access, LocalVariable variable, VariableScope scope ) { + not access instanceof ParameterAccess and variable = access.getVariable() and scope = variable.getDeclaringScope() } diff --git a/ql/test/library-tests/variables/variable.expected b/ql/test/library-tests/variables/variable.expected index 4010f77dd66..a9b283555f7 100644 --- a/ql/test/library-tests/variables/variable.expected +++ b/ql/test/library-tests/variables/variable.expected @@ -14,26 +14,26 @@ variable | parameters.rb:1:14:1:14 | x | | parameters.rb:1:18:1:18 | y | | parameters.rb:7:17:7:22 | client | -| parameters.rb:7:25:7:31 | pizzas | -| parameters.rb:15:15:15:19 | map | +| parameters.rb:7:26:7:31 | pizzas | +| parameters.rb:15:17:15:19 | map | | parameters.rb:16:16:16:18 | key | | parameters.rb:16:21:16:25 | value | -| parameters.rb:21:16:21:21 | block | -| parameters.rb:25:15:25:30 | name | -| parameters.rb:25:33:25:50 | size | -| parameters.rb:30:15:30:20 | first | -| parameters.rb:30:24:30:33 | middle | -| parameters.rb:30:36:30:40 | last | +| parameters.rb:21:17:21:21 | block | +| parameters.rb:25:15:25:18 | name | +| parameters.rb:25:33:25:36 | size | +| parameters.rb:30:15:30:19 | first | +| parameters.rb:30:24:30:29 | middle | +| parameters.rb:30:36:30:39 | last | | parameters.rb:34:1:34:1 | b | -| parameters.rb:35:11:35:21 | a | +| parameters.rb:35:11:35:11 | a | | parameters.rb:35:16:35:16 | b | -| parameters.rb:40:12:40:19 | d | +| parameters.rb:40:12:40:12 | d | | parameters.rb:40:15:40:15 | e | | parameters.rb:45:20:45:20 | _ | -| parameters.rb:49:12:49:16 | a | -| parameters.rb:49:12:49:16 | b | +| parameters.rb:49:13:49:13 | a | +| parameters.rb:49:15:49:15 | b | | parameters.rb:53:1:53:1 | x | -| parameters.rb:54:14:54:24 | y | +| parameters.rb:54:14:54:14 | y | | scopes.rb:2:14:2:14 | x | | scopes.rb:4:4:4:4 | a | | scopes.rb:7:1:7:1 | a | @@ -47,22 +47,22 @@ parameter | parameters.rb:1:14:1:14 | x | | parameters.rb:1:18:1:18 | y | | parameters.rb:7:17:7:22 | client | -| parameters.rb:7:25:7:31 | pizzas | -| parameters.rb:15:15:15:19 | map | +| parameters.rb:7:26:7:31 | pizzas | +| parameters.rb:15:17:15:19 | map | | parameters.rb:16:16:16:18 | key | | parameters.rb:16:21:16:25 | value | -| parameters.rb:21:16:21:21 | block | -| parameters.rb:25:15:25:30 | name | -| parameters.rb:25:33:25:50 | size | -| parameters.rb:30:15:30:20 | first | -| parameters.rb:30:24:30:33 | middle | -| parameters.rb:30:36:30:40 | last | -| parameters.rb:35:11:35:21 | a | -| parameters.rb:40:12:40:19 | d | +| parameters.rb:21:17:21:21 | block | +| parameters.rb:25:15:25:18 | name | +| parameters.rb:25:33:25:36 | size | +| parameters.rb:30:15:30:19 | first | +| parameters.rb:30:24:30:29 | middle | +| parameters.rb:30:36:30:39 | last | +| parameters.rb:35:11:35:11 | a | +| parameters.rb:40:12:40:12 | d | | parameters.rb:45:20:45:20 | _ | -| parameters.rb:49:12:49:16 | a | -| parameters.rb:49:12:49:16 | b | -| parameters.rb:54:14:54:24 | y | +| parameters.rb:49:13:49:13 | a | +| parameters.rb:49:15:49:15 | b | +| parameters.rb:54:14:54:14 | y | | scopes.rb:2:14:2:14 | x | | scopes.rb:9:14:9:14 | x | localVariable diff --git a/ql/test/library-tests/variables/variable.ql b/ql/test/library-tests/variables/variable.ql index 54300c416b4..13f7a0f0efa 100644 --- a/ql/test/library-tests/variables/variable.ql +++ b/ql/test/library-tests/variables/variable.ql @@ -2,6 +2,6 @@ import codeql_ruby.Variables query predicate variable(Variable v) { any() } -query predicate parameter(Parameter p) { any() } +query predicate parameter(LocalVariable v) { v.getAnAccess() instanceof ParameterAccess } -query predicate localVariable(LocalVariable v) { any() } +query predicate localVariable(LocalVariable v) { not v.getAnAccess() instanceof ParameterAccess }