mirror of
https://github.com/github/codeql.git
synced 2026-04-27 17:55:19 +02:00
Switch from details string to DataFlow::Node
This commit is contained in:
@@ -11,35 +11,7 @@ private import codeql.ruby.AST
|
||||
private import codeql.ruby.ApiGraphs
|
||||
private import queries.modeling.internal.Util as Util
|
||||
|
||||
string parameterDetails(DataFlow::ParameterNode paramNode) {
|
||||
exists(DataFlow::MethodNode methodNode | methodNode.getParameter(_) = paramNode |
|
||||
result = paramNode.getName()
|
||||
)
|
||||
or
|
||||
exists(DataFlow::MethodNode methodNode, string name |
|
||||
methodNode.getKeywordParameter(name) = paramNode
|
||||
|
|
||||
result = name + ":"
|
||||
)
|
||||
or
|
||||
exists(DataFlow::MethodNode methodNode | methodNode.getBlockParameter() = paramNode |
|
||||
result = "&" + paramNode.getName()
|
||||
or
|
||||
not exists(paramNode.getName()) and result = "&"
|
||||
)
|
||||
or
|
||||
exists(DataFlow::MethodNode methodNode | methodNode.getSelfParameter() = paramNode |
|
||||
result = "self"
|
||||
)
|
||||
or
|
||||
exists(DataFlow::MethodNode methodNode | methodNode.getHashSplatParameter() = paramNode |
|
||||
result = "**" + paramNode.getName()
|
||||
or
|
||||
not exists(paramNode.getName()) and result = "**"
|
||||
)
|
||||
}
|
||||
|
||||
predicate simpleParameters(string type, string path, string value, string details) {
|
||||
predicate simpleParameters(string type, string path, string value, DataFlow::Node details) {
|
||||
exists(DataFlow::MethodNode methodNode, DataFlow::ParameterNode paramNode |
|
||||
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
|
||||
(
|
||||
@@ -52,11 +24,11 @@ predicate simpleParameters(string type, string path, string value, string detail
|
||||
|
|
||||
Util::pathToMethod(methodNode, type, path) and
|
||||
value = Util::getArgumentPath(paramNode) and
|
||||
details = parameterDetails(paramNode)
|
||||
details = paramNode
|
||||
)
|
||||
}
|
||||
|
||||
predicate blockArguments(string type, string path, string value, string details) {
|
||||
predicate blockArguments(string type, string path, string value, DataFlow::Node details) {
|
||||
exists(DataFlow::MethodNode methodNode, DataFlow::CallNode callNode |
|
||||
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
|
||||
callNode = methodNode.getABlockCall()
|
||||
@@ -66,47 +38,45 @@ predicate blockArguments(string type, string path, string value, string details)
|
||||
argNode = callNode.getPositionalArgument(i)
|
||||
|
|
||||
value = "Argument[block].Parameter[" + i + "]" and
|
||||
details = argNode.asVariableAccessAstNode().getVariable().getName()
|
||||
details = argNode
|
||||
)
|
||||
or
|
||||
exists(DataFlow::ExprNode argNode, string keyword |
|
||||
argNode = callNode.getKeywordArgument(keyword)
|
||||
|
|
||||
value = "Argument[block].Parameter[" + keyword + ":]" and
|
||||
details = ":" + keyword
|
||||
details = argNode
|
||||
)
|
||||
or
|
||||
value = "Argument[block]" and
|
||||
(
|
||||
details = callNode.getMethodName()
|
||||
or
|
||||
not exists(callNode.getMethodName()) and
|
||||
callNode.getExprNode().getExpr() instanceof YieldCall and
|
||||
details = "yield ..."
|
||||
)
|
||||
details = callNode
|
||||
) and
|
||||
Util::pathToMethod(methodNode, type, path)
|
||||
)
|
||||
}
|
||||
|
||||
predicate returnValue(string type, string path, string value, string details) {
|
||||
predicate returnValue(string type, string path, string value, DataFlow::Node details) {
|
||||
exists(DataFlow::MethodNode methodNode, DataFlow::Node returnNode |
|
||||
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
|
||||
returnNode = methodNode.getAReturnNode()
|
||||
|
|
||||
Util::pathToMethod(methodNode, type, path) and
|
||||
value = "ReturnValue" and
|
||||
details = returnNode.toString()
|
||||
details = returnNode
|
||||
)
|
||||
}
|
||||
|
||||
predicate inputAccessPaths(string type, string path, string value, string details, string defType) {
|
||||
predicate inputAccessPaths(
|
||||
string type, string path, string value, DataFlow::Node details, string defType
|
||||
) {
|
||||
simpleParameters(type, path, value, details) and defType = "parameter"
|
||||
or
|
||||
blockArguments(type, path, value, details) and defType = "parameter"
|
||||
}
|
||||
|
||||
predicate outputAccessPaths(string type, string path, string value, string details, string defType) {
|
||||
predicate outputAccessPaths(
|
||||
string type, string path, string value, DataFlow::Node details, string defType
|
||||
) {
|
||||
simpleParameters(type, path, value, details) and defType = "parameter"
|
||||
or
|
||||
blockArguments(type, path, value, details) and defType = "parameter"
|
||||
|
||||
@@ -1,69 +1,75 @@
|
||||
input
|
||||
| A | Method[bar] | Argument[0] | x | parameter |
|
||||
| A | Method[bar] | Argument[self] | self | parameter |
|
||||
| A | Method[foo] | Argument[0] | x | parameter |
|
||||
| A | Method[foo] | Argument[1] | y | parameter |
|
||||
| A | Method[foo] | Argument[2] | key1: | parameter |
|
||||
| A | Method[foo] | Argument[block] | call | parameter |
|
||||
| A | Method[foo] | Argument[block] | yield ... | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[0] | x | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[1] | y | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[key2:] | :key2 | parameter |
|
||||
| A | Method[foo] | Argument[key1:] | key1: | parameter |
|
||||
| A | Method[foo] | Argument[self] | self | parameter |
|
||||
| A! | Method[new] | Argument[0] | x | parameter |
|
||||
| A! | Method[new] | Argument[1] | y | parameter |
|
||||
| A! | Method[new] | Argument[self] | self | parameter |
|
||||
| A! | Method[self_foo] | Argument[0] | x | parameter |
|
||||
| A! | Method[self_foo] | Argument[1] | y | parameter |
|
||||
| A! | Method[self_foo] | Argument[self] | self | parameter |
|
||||
| A::ANested | Method[foo] | Argument[0] | x | parameter |
|
||||
| A::ANested | Method[foo] | Argument[1] | y | parameter |
|
||||
| A::ANested | Method[foo] | Argument[self] | self | parameter |
|
||||
| B | Method[foo] | Argument[0] | x | parameter |
|
||||
| B | Method[foo] | Argument[1] | y | parameter |
|
||||
| B | Method[foo] | Argument[self] | self | parameter |
|
||||
| M1 | Method[foo] | Argument[0] | x | parameter |
|
||||
| M1 | Method[foo] | Argument[1] | y | parameter |
|
||||
| M1 | Method[foo] | Argument[self] | self | parameter |
|
||||
| M1! | Method[self_foo] | Argument[0] | x | parameter |
|
||||
| M1! | Method[self_foo] | Argument[1] | y | parameter |
|
||||
| M1! | Method[self_foo] | Argument[self] | self | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[0] | x | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[1] | y | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[self] | self | parameter |
|
||||
| A | Method[bar] | Argument[0] | lib/mylib.rb:13:11:13:11 | x | parameter |
|
||||
| A | Method[bar] | Argument[self] | lib/mylib.rb:13:3:14:5 | self in bar | parameter |
|
||||
| A | Method[foo] | Argument[0] | lib/mylib.rb:7:11:7:11 | x | parameter |
|
||||
| A | Method[foo] | Argument[1] | lib/mylib.rb:7:14:7:14 | y | parameter |
|
||||
| A | Method[foo] | Argument[2] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[block] | lib/mylib.rb:8:5:8:32 | call to call | parameter |
|
||||
| A | Method[foo] | Argument[block] | lib/mylib.rb:10:5:10:26 | yield ... | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:8:16:8:16 | x | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:10:11:10:11 | x | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:8:19:8:19 | y | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:10:14:10:14 | y | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:8:28:8:31 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:10:23:10:26 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[key1:] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[self] | lib/mylib.rb:7:3:11:5 | self in foo | parameter |
|
||||
| A! | Method[new] | Argument[0] | lib/mylib.rb:4:18:4:18 | x | parameter |
|
||||
| A! | Method[new] | Argument[1] | lib/mylib.rb:4:21:4:21 | y | parameter |
|
||||
| A! | Method[new] | Argument[self] | lib/mylib.rb:4:3:5:5 | self in initialize | parameter |
|
||||
| A! | Method[self_foo] | Argument[0] | lib/mylib.rb:16:21:16:21 | x | parameter |
|
||||
| A! | Method[self_foo] | Argument[1] | lib/mylib.rb:16:24:16:24 | y | parameter |
|
||||
| A! | Method[self_foo] | Argument[self] | lib/mylib.rb:16:3:17:5 | self in self_foo | parameter |
|
||||
| A::ANested | Method[foo] | Argument[0] | lib/mylib.rb:25:13:25:13 | x | parameter |
|
||||
| A::ANested | Method[foo] | Argument[1] | lib/mylib.rb:25:16:25:16 | y | parameter |
|
||||
| A::ANested | Method[foo] | Argument[self] | lib/mylib.rb:25:5:26:7 | self in foo | parameter |
|
||||
| B | Method[foo] | Argument[0] | lib/other.rb:6:11:6:11 | x | parameter |
|
||||
| B | Method[foo] | Argument[1] | lib/other.rb:6:14:6:14 | y | parameter |
|
||||
| B | Method[foo] | Argument[self] | lib/other.rb:6:3:7:5 | self in foo | parameter |
|
||||
| M1 | Method[foo] | Argument[0] | lib/module.rb:2:11:2:11 | x | parameter |
|
||||
| M1 | Method[foo] | Argument[1] | lib/module.rb:2:14:2:14 | y | parameter |
|
||||
| M1 | Method[foo] | Argument[self] | lib/module.rb:2:3:3:5 | self in foo | parameter |
|
||||
| M1! | Method[self_foo] | Argument[0] | lib/module.rb:5:21:5:21 | x | parameter |
|
||||
| M1! | Method[self_foo] | Argument[1] | lib/module.rb:5:24:5:24 | y | parameter |
|
||||
| M1! | Method[self_foo] | Argument[self] | lib/module.rb:5:3:6:5 | self in self_foo | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[0] | other_lib/lib/other_gem.rb:3:17:3:17 | x | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[1] | other_lib/lib/other_gem.rb:3:20:3:20 | y | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[self] | other_lib/lib/other_gem.rb:3:9:4:11 | self in foo | parameter |
|
||||
output
|
||||
| A | Method[bar] | Argument[0] | x | parameter |
|
||||
| A | Method[bar] | Argument[self] | self | parameter |
|
||||
| A | Method[foo] | Argument[0] | x | parameter |
|
||||
| A | Method[foo] | Argument[1] | y | parameter |
|
||||
| A | Method[foo] | Argument[2] | key1: | parameter |
|
||||
| A | Method[foo] | Argument[block] | call | parameter |
|
||||
| A | Method[foo] | Argument[block] | yield ... | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[0] | x | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[1] | y | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[key2:] | :key2 | parameter |
|
||||
| A | Method[foo] | Argument[key1:] | key1: | parameter |
|
||||
| A | Method[foo] | Argument[self] | self | parameter |
|
||||
| A | Method[foo] | ReturnValue | yield ... | return |
|
||||
| A! | Method[new] | Argument[0] | x | parameter |
|
||||
| A! | Method[new] | Argument[1] | y | parameter |
|
||||
| A! | Method[new] | Argument[self] | self | parameter |
|
||||
| A! | Method[self_foo] | Argument[0] | x | parameter |
|
||||
| A! | Method[self_foo] | Argument[1] | y | parameter |
|
||||
| A! | Method[self_foo] | Argument[self] | self | parameter |
|
||||
| A::ANested | Method[foo] | Argument[0] | x | parameter |
|
||||
| A::ANested | Method[foo] | Argument[1] | y | parameter |
|
||||
| A::ANested | Method[foo] | Argument[self] | self | parameter |
|
||||
| B | Method[foo] | Argument[0] | x | parameter |
|
||||
| B | Method[foo] | Argument[1] | y | parameter |
|
||||
| B | Method[foo] | Argument[self] | self | parameter |
|
||||
| M1 | Method[foo] | Argument[0] | x | parameter |
|
||||
| M1 | Method[foo] | Argument[1] | y | parameter |
|
||||
| M1 | Method[foo] | Argument[self] | self | parameter |
|
||||
| M1! | Method[self_foo] | Argument[0] | x | parameter |
|
||||
| M1! | Method[self_foo] | Argument[1] | y | parameter |
|
||||
| M1! | Method[self_foo] | Argument[self] | self | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[0] | x | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[1] | y | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[self] | self | parameter |
|
||||
| A | Method[bar] | Argument[0] | lib/mylib.rb:13:11:13:11 | x | parameter |
|
||||
| A | Method[bar] | Argument[self] | lib/mylib.rb:13:3:14:5 | self in bar | parameter |
|
||||
| A | Method[foo] | Argument[0] | lib/mylib.rb:7:11:7:11 | x | parameter |
|
||||
| A | Method[foo] | Argument[1] | lib/mylib.rb:7:14:7:14 | y | parameter |
|
||||
| A | Method[foo] | Argument[2] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[block] | lib/mylib.rb:8:5:8:32 | call to call | parameter |
|
||||
| A | Method[foo] | Argument[block] | lib/mylib.rb:10:5:10:26 | yield ... | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:8:16:8:16 | x | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:10:11:10:11 | x | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:8:19:8:19 | y | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:10:14:10:14 | y | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:8:28:8:31 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:10:23:10:26 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[key1:] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
|
||||
| A | Method[foo] | Argument[self] | lib/mylib.rb:7:3:11:5 | self in foo | parameter |
|
||||
| A | Method[foo] | ReturnValue | lib/mylib.rb:10:5:10:26 | yield ... | return |
|
||||
| A! | Method[new] | Argument[0] | lib/mylib.rb:4:18:4:18 | x | parameter |
|
||||
| A! | Method[new] | Argument[1] | lib/mylib.rb:4:21:4:21 | y | parameter |
|
||||
| A! | Method[new] | Argument[self] | lib/mylib.rb:4:3:5:5 | self in initialize | parameter |
|
||||
| A! | Method[self_foo] | Argument[0] | lib/mylib.rb:16:21:16:21 | x | parameter |
|
||||
| A! | Method[self_foo] | Argument[1] | lib/mylib.rb:16:24:16:24 | y | parameter |
|
||||
| A! | Method[self_foo] | Argument[self] | lib/mylib.rb:16:3:17:5 | self in self_foo | parameter |
|
||||
| A::ANested | Method[foo] | Argument[0] | lib/mylib.rb:25:13:25:13 | x | parameter |
|
||||
| A::ANested | Method[foo] | Argument[1] | lib/mylib.rb:25:16:25:16 | y | parameter |
|
||||
| A::ANested | Method[foo] | Argument[self] | lib/mylib.rb:25:5:26:7 | self in foo | parameter |
|
||||
| B | Method[foo] | Argument[0] | lib/other.rb:6:11:6:11 | x | parameter |
|
||||
| B | Method[foo] | Argument[1] | lib/other.rb:6:14:6:14 | y | parameter |
|
||||
| B | Method[foo] | Argument[self] | lib/other.rb:6:3:7:5 | self in foo | parameter |
|
||||
| M1 | Method[foo] | Argument[0] | lib/module.rb:2:11:2:11 | x | parameter |
|
||||
| M1 | Method[foo] | Argument[1] | lib/module.rb:2:14:2:14 | y | parameter |
|
||||
| M1 | Method[foo] | Argument[self] | lib/module.rb:2:3:3:5 | self in foo | parameter |
|
||||
| M1! | Method[self_foo] | Argument[0] | lib/module.rb:5:21:5:21 | x | parameter |
|
||||
| M1! | Method[self_foo] | Argument[1] | lib/module.rb:5:24:5:24 | y | parameter |
|
||||
| M1! | Method[self_foo] | Argument[self] | lib/module.rb:5:3:6:5 | self in self_foo | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[0] | other_lib/lib/other_gem.rb:3:17:3:17 | x | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[1] | other_lib/lib/other_gem.rb:3:20:3:20 | y | parameter |
|
||||
| OtherLib::A | Method[foo] | Argument[self] | other_lib/lib/other_gem.rb:3:9:4:11 | self in foo | parameter |
|
||||
|
||||
Reference in New Issue
Block a user