@@ -18,17 +18,26 @@ module Kernel {
18
18
* providing a specific receiver as in `Kernel.exit`.
19
19
*/
20
20
class KernelMethodCall extends DataFlow:: CallNode {
21
+ string methodName ;
22
+
21
23
KernelMethodCall ( ) {
22
- this = API:: getTopLevelMember ( "Kernel" ) .getAMethodCall ( _ )
24
+ this = API:: getTopLevelMember ( "Kernel" ) .getAMethodCall ( methodName )
23
25
or
24
26
this .asExpr ( ) .getExpr ( ) instanceof UnknownMethodCall and
27
+ methodName = super .getMethodName ( ) and
25
28
(
26
29
this .getReceiver ( ) .asExpr ( ) .getExpr ( ) instanceof SelfVariableAccess and
27
- isPrivateKernelMethod ( this . getMethodName ( ) )
30
+ isPrivateKernelMethod ( methodName )
28
31
or
29
- isPublicKernelMethod ( this . getMethodName ( ) )
32
+ isPublicKernelMethod ( methodName )
30
33
)
31
34
}
35
+
36
+ /**
37
+ * Gets which method of `Kernel` is called.
38
+ * Works even when the call is a `super(...)` call.
39
+ */
40
+ string getKernelMethod ( ) { result = methodName }
32
41
}
33
42
34
43
/**
@@ -93,7 +102,7 @@ module Kernel {
93
102
* Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-system
94
103
*/
95
104
class KernelSystemCall extends SystemCommandExecution:: Range instanceof KernelMethodCall {
96
- KernelSystemCall ( ) { this .getMethodName ( ) = "system" }
105
+ KernelSystemCall ( ) { this .getKernelMethod ( ) = "system" }
97
106
98
107
override DataFlow:: Node getAnArgument ( ) { result = super .getArgument ( _) }
99
108
@@ -109,7 +118,7 @@ module Kernel {
109
118
* Ruby documentation: https://docs.ruby-lang.org/en/3.0.0/Kernel.html#method-i-exec
110
119
*/
111
120
class KernelExecCall extends SystemCommandExecution:: Range instanceof KernelMethodCall {
112
- KernelExecCall ( ) { this .getMethodName ( ) = "exec" }
121
+ KernelExecCall ( ) { this .getKernelMethod ( ) = "exec" }
113
122
114
123
override DataFlow:: Node getAnArgument ( ) { result = super .getArgument ( _) }
115
124
@@ -130,7 +139,7 @@ module Kernel {
130
139
* ```
131
140
*/
132
141
class KernelSpawnCall extends SystemCommandExecution:: Range instanceof KernelMethodCall {
133
- KernelSpawnCall ( ) { this .getMethodName ( ) = "spawn" }
142
+ KernelSpawnCall ( ) { this .getKernelMethod ( ) = "spawn" }
134
143
135
144
override DataFlow:: Node getAnArgument ( ) { result = super .getArgument ( _) }
136
145
@@ -149,7 +158,7 @@ module Kernel {
149
158
* ```
150
159
*/
151
160
class EvalCallCodeExecution extends CodeExecution:: Range , KernelMethodCall {
152
- EvalCallCodeExecution ( ) { this .getMethodName ( ) = "eval" }
161
+ EvalCallCodeExecution ( ) { this .getKernelMethod ( ) = "eval" }
153
162
154
163
override DataFlow:: Node getCode ( ) { result = this .getArgument ( 0 ) }
155
164
}
@@ -163,7 +172,7 @@ module Kernel {
163
172
* ```
164
173
*/
165
174
class SendCallCodeExecution extends CodeExecution:: Range , KernelMethodCall {
166
- SendCallCodeExecution ( ) { this .getMethodName ( ) = "send" }
175
+ SendCallCodeExecution ( ) { this .getKernelMethod ( ) = "send" }
167
176
168
177
override DataFlow:: Node getCode ( ) { result = this .getArgument ( 0 ) }
169
178
@@ -183,15 +192,15 @@ module Kernel {
183
192
/** A call to e.g. `Kernel.load` that accesses a file. */
184
193
private class KernelFileAccess extends FileSystemAccess:: Range instanceof KernelMethodCall {
185
194
KernelFileAccess ( ) {
186
- super .getMethodName ( ) = [ "load" , "require" , "require_relative" , "autoload" , "autoload?" ]
195
+ super .getKernelMethod ( ) = [ "load" , "require" , "require_relative" , "autoload" , "autoload?" ]
187
196
}
188
197
189
198
override DataFlow:: Node getAPathArgument ( ) {
190
199
result = super .getArgument ( 0 ) and
191
- super .getMethodName ( ) = [ "load" , "require" , "require_relative" ]
200
+ super .getKernelMethod ( ) = [ "load" , "require" , "require_relative" ]
192
201
or
193
202
result = super .getArgument ( 1 ) and
194
- super .getMethodName ( ) = [ "autoload" , "autoload?" ]
203
+ super .getKernelMethod ( ) = [ "autoload" , "autoload?" ]
195
204
}
196
205
}
197
206
}
0 commit comments