Skip to content

Commit 49dbad9

Browse files
committed
Switch from details string to DataFlow::Node
1 parent f83d2a7 commit 49dbad9

File tree

2 files changed

+87
-111
lines changed

2 files changed

+87
-111
lines changed

ruby/ql/src/utils/modeleditor/FrameworkModeAccessPaths.ql

Lines changed: 14 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -11,35 +11,7 @@ private import codeql.ruby.AST
1111
private import codeql.ruby.ApiGraphs
1212
private import queries.modeling.internal.Util as Util
1313

14-
string parameterDetails(DataFlow::ParameterNode paramNode) {
15-
exists(DataFlow::MethodNode methodNode | methodNode.getParameter(_) = paramNode |
16-
result = paramNode.getName()
17-
)
18-
or
19-
exists(DataFlow::MethodNode methodNode, string name |
20-
methodNode.getKeywordParameter(name) = paramNode
21-
|
22-
result = name + ":"
23-
)
24-
or
25-
exists(DataFlow::MethodNode methodNode | methodNode.getBlockParameter() = paramNode |
26-
result = "&" + paramNode.getName()
27-
or
28-
not exists(paramNode.getName()) and result = "&"
29-
)
30-
or
31-
exists(DataFlow::MethodNode methodNode | methodNode.getSelfParameter() = paramNode |
32-
result = "self"
33-
)
34-
or
35-
exists(DataFlow::MethodNode methodNode | methodNode.getHashSplatParameter() = paramNode |
36-
result = "**" + paramNode.getName()
37-
or
38-
not exists(paramNode.getName()) and result = "**"
39-
)
40-
}
41-
42-
predicate simpleParameters(string type, string path, string value, string details) {
14+
predicate simpleParameters(string type, string path, string value, DataFlow::Node details) {
4315
exists(DataFlow::MethodNode methodNode, DataFlow::ParameterNode paramNode |
4416
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
4517
(
@@ -52,11 +24,11 @@ predicate simpleParameters(string type, string path, string value, string detail
5224
|
5325
Util::pathToMethod(methodNode, type, path) and
5426
value = Util::getArgumentPath(paramNode) and
55-
details = parameterDetails(paramNode)
27+
details = paramNode
5628
)
5729
}
5830

59-
predicate blockArguments(string type, string path, string value, string details) {
31+
predicate blockArguments(string type, string path, string value, DataFlow::Node details) {
6032
exists(DataFlow::MethodNode methodNode, DataFlow::CallNode callNode |
6133
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
6234
callNode = methodNode.getABlockCall()
@@ -66,47 +38,45 @@ predicate blockArguments(string type, string path, string value, string details)
6638
argNode = callNode.getPositionalArgument(i)
6739
|
6840
value = "Argument[block].Parameter[" + i + "]" and
69-
details = argNode.asVariableAccessAstNode().getVariable().getName()
41+
details = argNode
7042
)
7143
or
7244
exists(DataFlow::ExprNode argNode, string keyword |
7345
argNode = callNode.getKeywordArgument(keyword)
7446
|
7547
value = "Argument[block].Parameter[" + keyword + ":]" and
76-
details = ":" + keyword
48+
details = argNode
7749
)
7850
or
7951
value = "Argument[block]" and
80-
(
81-
details = callNode.getMethodName()
82-
or
83-
not exists(callNode.getMethodName()) and
84-
callNode.getExprNode().getExpr() instanceof YieldCall and
85-
details = "yield ..."
86-
)
52+
details = callNode
8753
) and
8854
Util::pathToMethod(methodNode, type, path)
8955
)
9056
}
9157

92-
predicate returnValue(string type, string path, string value, string details) {
58+
predicate returnValue(string type, string path, string value, DataFlow::Node details) {
9359
exists(DataFlow::MethodNode methodNode, DataFlow::Node returnNode |
9460
methodNode.getLocation().getFile() instanceof Util::RelevantFile and
9561
returnNode = methodNode.getAReturnNode()
9662
|
9763
Util::pathToMethod(methodNode, type, path) and
9864
value = "ReturnValue" and
99-
details = returnNode.toString()
65+
details = returnNode
10066
)
10167
}
10268

103-
predicate inputAccessPaths(string type, string path, string value, string details, string defType) {
69+
predicate inputAccessPaths(
70+
string type, string path, string value, DataFlow::Node details, string defType
71+
) {
10472
simpleParameters(type, path, value, details) and defType = "parameter"
10573
or
10674
blockArguments(type, path, value, details) and defType = "parameter"
10775
}
10876

109-
predicate outputAccessPaths(string type, string path, string value, string details, string defType) {
77+
predicate outputAccessPaths(
78+
string type, string path, string value, DataFlow::Node details, string defType
79+
) {
11080
simpleParameters(type, path, value, details) and defType = "parameter"
11181
or
11282
blockArguments(type, path, value, details) and defType = "parameter"
Lines changed: 73 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,75 @@
11
input
2-
| A | Method[bar] | Argument[0] | x | parameter |
3-
| A | Method[bar] | Argument[self] | self | parameter |
4-
| A | Method[foo] | Argument[0] | x | parameter |
5-
| A | Method[foo] | Argument[1] | y | parameter |
6-
| A | Method[foo] | Argument[2] | key1: | parameter |
7-
| A | Method[foo] | Argument[block] | call | parameter |
8-
| A | Method[foo] | Argument[block] | yield ... | parameter |
9-
| A | Method[foo] | Argument[block].Parameter[0] | x | parameter |
10-
| A | Method[foo] | Argument[block].Parameter[1] | y | parameter |
11-
| A | Method[foo] | Argument[block].Parameter[key2:] | :key2 | parameter |
12-
| A | Method[foo] | Argument[key1:] | key1: | parameter |
13-
| A | Method[foo] | Argument[self] | self | parameter |
14-
| A! | Method[new] | Argument[0] | x | parameter |
15-
| A! | Method[new] | Argument[1] | y | parameter |
16-
| A! | Method[new] | Argument[self] | self | parameter |
17-
| A! | Method[self_foo] | Argument[0] | x | parameter |
18-
| A! | Method[self_foo] | Argument[1] | y | parameter |
19-
| A! | Method[self_foo] | Argument[self] | self | parameter |
20-
| A::ANested | Method[foo] | Argument[0] | x | parameter |
21-
| A::ANested | Method[foo] | Argument[1] | y | parameter |
22-
| A::ANested | Method[foo] | Argument[self] | self | parameter |
23-
| B | Method[foo] | Argument[0] | x | parameter |
24-
| B | Method[foo] | Argument[1] | y | parameter |
25-
| B | Method[foo] | Argument[self] | self | parameter |
26-
| M1 | Method[foo] | Argument[0] | x | parameter |
27-
| M1 | Method[foo] | Argument[1] | y | parameter |
28-
| M1 | Method[foo] | Argument[self] | self | parameter |
29-
| M1! | Method[self_foo] | Argument[0] | x | parameter |
30-
| M1! | Method[self_foo] | Argument[1] | y | parameter |
31-
| M1! | Method[self_foo] | Argument[self] | self | parameter |
32-
| OtherLib::A | Method[foo] | Argument[0] | x | parameter |
33-
| OtherLib::A | Method[foo] | Argument[1] | y | parameter |
34-
| OtherLib::A | Method[foo] | Argument[self] | self | parameter |
2+
| A | Method[bar] | Argument[0] | lib/mylib.rb:13:11:13:11 | x | parameter |
3+
| A | Method[bar] | Argument[self] | lib/mylib.rb:13:3:14:5 | self in bar | parameter |
4+
| A | Method[foo] | Argument[0] | lib/mylib.rb:7:11:7:11 | x | parameter |
5+
| A | Method[foo] | Argument[1] | lib/mylib.rb:7:14:7:14 | y | parameter |
6+
| A | Method[foo] | Argument[2] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
7+
| A | Method[foo] | Argument[block] | lib/mylib.rb:8:5:8:32 | call to call | parameter |
8+
| A | Method[foo] | Argument[block] | lib/mylib.rb:10:5:10:26 | yield ... | parameter |
9+
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:8:16:8:16 | x | parameter |
10+
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:10:11:10:11 | x | parameter |
11+
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:8:19:8:19 | y | parameter |
12+
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:10:14:10:14 | y | parameter |
13+
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:8:28:8:31 | key1 | parameter |
14+
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:10:23:10:26 | key1 | parameter |
15+
| A | Method[foo] | Argument[key1:] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
16+
| A | Method[foo] | Argument[self] | lib/mylib.rb:7:3:11:5 | self in foo | parameter |
17+
| A! | Method[new] | Argument[0] | lib/mylib.rb:4:18:4:18 | x | parameter |
18+
| A! | Method[new] | Argument[1] | lib/mylib.rb:4:21:4:21 | y | parameter |
19+
| A! | Method[new] | Argument[self] | lib/mylib.rb:4:3:5:5 | self in initialize | parameter |
20+
| A! | Method[self_foo] | Argument[0] | lib/mylib.rb:16:21:16:21 | x | parameter |
21+
| A! | Method[self_foo] | Argument[1] | lib/mylib.rb:16:24:16:24 | y | parameter |
22+
| A! | Method[self_foo] | Argument[self] | lib/mylib.rb:16:3:17:5 | self in self_foo | parameter |
23+
| A::ANested | Method[foo] | Argument[0] | lib/mylib.rb:25:13:25:13 | x | parameter |
24+
| A::ANested | Method[foo] | Argument[1] | lib/mylib.rb:25:16:25:16 | y | parameter |
25+
| A::ANested | Method[foo] | Argument[self] | lib/mylib.rb:25:5:26:7 | self in foo | parameter |
26+
| B | Method[foo] | Argument[0] | lib/other.rb:6:11:6:11 | x | parameter |
27+
| B | Method[foo] | Argument[1] | lib/other.rb:6:14:6:14 | y | parameter |
28+
| B | Method[foo] | Argument[self] | lib/other.rb:6:3:7:5 | self in foo | parameter |
29+
| M1 | Method[foo] | Argument[0] | lib/module.rb:2:11:2:11 | x | parameter |
30+
| M1 | Method[foo] | Argument[1] | lib/module.rb:2:14:2:14 | y | parameter |
31+
| M1 | Method[foo] | Argument[self] | lib/module.rb:2:3:3:5 | self in foo | parameter |
32+
| M1! | Method[self_foo] | Argument[0] | lib/module.rb:5:21:5:21 | x | parameter |
33+
| M1! | Method[self_foo] | Argument[1] | lib/module.rb:5:24:5:24 | y | parameter |
34+
| M1! | Method[self_foo] | Argument[self] | lib/module.rb:5:3:6:5 | self in self_foo | parameter |
35+
| OtherLib::A | Method[foo] | Argument[0] | other_lib/lib/other_gem.rb:3:17:3:17 | x | parameter |
36+
| OtherLib::A | Method[foo] | Argument[1] | other_lib/lib/other_gem.rb:3:20:3:20 | y | parameter |
37+
| OtherLib::A | Method[foo] | Argument[self] | other_lib/lib/other_gem.rb:3:9:4:11 | self in foo | parameter |
3538
output
36-
| A | Method[bar] | Argument[0] | x | parameter |
37-
| A | Method[bar] | Argument[self] | self | parameter |
38-
| A | Method[foo] | Argument[0] | x | parameter |
39-
| A | Method[foo] | Argument[1] | y | parameter |
40-
| A | Method[foo] | Argument[2] | key1: | parameter |
41-
| A | Method[foo] | Argument[block] | call | parameter |
42-
| A | Method[foo] | Argument[block] | yield ... | parameter |
43-
| A | Method[foo] | Argument[block].Parameter[0] | x | parameter |
44-
| A | Method[foo] | Argument[block].Parameter[1] | y | parameter |
45-
| A | Method[foo] | Argument[block].Parameter[key2:] | :key2 | parameter |
46-
| A | Method[foo] | Argument[key1:] | key1: | parameter |
47-
| A | Method[foo] | Argument[self] | self | parameter |
48-
| A | Method[foo] | ReturnValue | yield ... | return |
49-
| A! | Method[new] | Argument[0] | x | parameter |
50-
| A! | Method[new] | Argument[1] | y | parameter |
51-
| A! | Method[new] | Argument[self] | self | parameter |
52-
| A! | Method[self_foo] | Argument[0] | x | parameter |
53-
| A! | Method[self_foo] | Argument[1] | y | parameter |
54-
| A! | Method[self_foo] | Argument[self] | self | parameter |
55-
| A::ANested | Method[foo] | Argument[0] | x | parameter |
56-
| A::ANested | Method[foo] | Argument[1] | y | parameter |
57-
| A::ANested | Method[foo] | Argument[self] | self | parameter |
58-
| B | Method[foo] | Argument[0] | x | parameter |
59-
| B | Method[foo] | Argument[1] | y | parameter |
60-
| B | Method[foo] | Argument[self] | self | parameter |
61-
| M1 | Method[foo] | Argument[0] | x | parameter |
62-
| M1 | Method[foo] | Argument[1] | y | parameter |
63-
| M1 | Method[foo] | Argument[self] | self | parameter |
64-
| M1! | Method[self_foo] | Argument[0] | x | parameter |
65-
| M1! | Method[self_foo] | Argument[1] | y | parameter |
66-
| M1! | Method[self_foo] | Argument[self] | self | parameter |
67-
| OtherLib::A | Method[foo] | Argument[0] | x | parameter |
68-
| OtherLib::A | Method[foo] | Argument[1] | y | parameter |
69-
| OtherLib::A | Method[foo] | Argument[self] | self | parameter |
39+
| A | Method[bar] | Argument[0] | lib/mylib.rb:13:11:13:11 | x | parameter |
40+
| A | Method[bar] | Argument[self] | lib/mylib.rb:13:3:14:5 | self in bar | parameter |
41+
| A | Method[foo] | Argument[0] | lib/mylib.rb:7:11:7:11 | x | parameter |
42+
| A | Method[foo] | Argument[1] | lib/mylib.rb:7:14:7:14 | y | parameter |
43+
| A | Method[foo] | Argument[2] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
44+
| A | Method[foo] | Argument[block] | lib/mylib.rb:8:5:8:32 | call to call | parameter |
45+
| A | Method[foo] | Argument[block] | lib/mylib.rb:10:5:10:26 | yield ... | parameter |
46+
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:8:16:8:16 | x | parameter |
47+
| A | Method[foo] | Argument[block].Parameter[0] | lib/mylib.rb:10:11:10:11 | x | parameter |
48+
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:8:19:8:19 | y | parameter |
49+
| A | Method[foo] | Argument[block].Parameter[1] | lib/mylib.rb:10:14:10:14 | y | parameter |
50+
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:8:28:8:31 | key1 | parameter |
51+
| A | Method[foo] | Argument[block].Parameter[key2:] | lib/mylib.rb:10:23:10:26 | key1 | parameter |
52+
| A | Method[foo] | Argument[key1:] | lib/mylib.rb:7:17:7:20 | key1 | parameter |
53+
| A | Method[foo] | Argument[self] | lib/mylib.rb:7:3:11:5 | self in foo | parameter |
54+
| A | Method[foo] | ReturnValue | lib/mylib.rb:10:5:10:26 | yield ... | return |
55+
| A! | Method[new] | Argument[0] | lib/mylib.rb:4:18:4:18 | x | parameter |
56+
| A! | Method[new] | Argument[1] | lib/mylib.rb:4:21:4:21 | y | parameter |
57+
| A! | Method[new] | Argument[self] | lib/mylib.rb:4:3:5:5 | self in initialize | parameter |
58+
| A! | Method[self_foo] | Argument[0] | lib/mylib.rb:16:21:16:21 | x | parameter |
59+
| A! | Method[self_foo] | Argument[1] | lib/mylib.rb:16:24:16:24 | y | parameter |
60+
| A! | Method[self_foo] | Argument[self] | lib/mylib.rb:16:3:17:5 | self in self_foo | parameter |
61+
| A::ANested | Method[foo] | Argument[0] | lib/mylib.rb:25:13:25:13 | x | parameter |
62+
| A::ANested | Method[foo] | Argument[1] | lib/mylib.rb:25:16:25:16 | y | parameter |
63+
| A::ANested | Method[foo] | Argument[self] | lib/mylib.rb:25:5:26:7 | self in foo | parameter |
64+
| B | Method[foo] | Argument[0] | lib/other.rb:6:11:6:11 | x | parameter |
65+
| B | Method[foo] | Argument[1] | lib/other.rb:6:14:6:14 | y | parameter |
66+
| B | Method[foo] | Argument[self] | lib/other.rb:6:3:7:5 | self in foo | parameter |
67+
| M1 | Method[foo] | Argument[0] | lib/module.rb:2:11:2:11 | x | parameter |
68+
| M1 | Method[foo] | Argument[1] | lib/module.rb:2:14:2:14 | y | parameter |
69+
| M1 | Method[foo] | Argument[self] | lib/module.rb:2:3:3:5 | self in foo | parameter |
70+
| M1! | Method[self_foo] | Argument[0] | lib/module.rb:5:21:5:21 | x | parameter |
71+
| M1! | Method[self_foo] | Argument[1] | lib/module.rb:5:24:5:24 | y | parameter |
72+
| M1! | Method[self_foo] | Argument[self] | lib/module.rb:5:3:6:5 | self in self_foo | parameter |
73+
| OtherLib::A | Method[foo] | Argument[0] | other_lib/lib/other_gem.rb:3:17:3:17 | x | parameter |
74+
| OtherLib::A | Method[foo] | Argument[1] | other_lib/lib/other_gem.rb:3:20:3:20 | y | parameter |
75+
| OtherLib::A | Method[foo] | Argument[self] | other_lib/lib/other_gem.rb:3:9:4:11 | self in foo | parameter |

0 commit comments

Comments
 (0)