22 * Provides modeling for the `Open3` library.
33 */
44
5- private import codeql.ruby.AST
6- private import codeql.ruby.DataFlow
5+ private import ruby
76private import codeql.ruby.ApiGraphs
8- private import codeql.ruby.frameworks.Stdlib
97private import codeql.ruby.Concepts
108
119/**
@@ -17,23 +15,19 @@ module Open3 {
1715 * These methods take the same argument forms as `Kernel.system`.
1816 * See `KernelSystemCall` for details.
1917 */
20- class Open3Call extends SystemCommandExecution:: Range {
21- MethodCall methodCall ;
22-
18+ class Open3Call extends SystemCommandExecution:: Range instanceof DataFlow:: CallNode {
2319 Open3Call ( ) {
24- this .asExpr ( ) .getExpr ( ) = methodCall and
2520 this =
2621 API:: getTopLevelMember ( "Open3" )
2722 .getAMethodCall ( [ "popen3" , "popen2" , "popen2e" , "capture3" , "capture2" , "capture2e" ] )
2823 }
2924
30- override DataFlow:: Node getAnArgument ( ) {
31- result .asExpr ( ) .getExpr ( ) = methodCall .getAnArgument ( )
32- }
25+ override DataFlow:: Node getAnArgument ( ) { result = super .getArgument ( _) }
3326
3427 override predicate isShellInterpreted ( DataFlow:: Node arg ) {
3528 // These Open3 methods invoke a subshell if you provide a single string as argument
36- methodCall .getNumberOfArguments ( ) = 1 and arg .asExpr ( ) .getExpr ( ) = methodCall .getAnArgument ( )
29+ super .getNumberOfArguments ( ) = 1 and
30+ arg = this .getAnArgument ( )
3731 }
3832 }
3933
@@ -47,26 +41,21 @@ module Open3 {
4741 * Open3.pipeline([{}, "cat", "foo.txt"], "tail")
4842 * Open3.pipeline([["cat", "cat"], "foo.txt"], "tail")
4943 */
50- class Open3PipelineCall extends SystemCommandExecution:: Range {
51- MethodCall methodCall ;
52-
44+ class Open3PipelineCall extends SystemCommandExecution:: Range instanceof DataFlow:: CallNode {
5345 Open3PipelineCall ( ) {
54- this .asExpr ( ) .getExpr ( ) = methodCall and
5546 this =
5647 API:: getTopLevelMember ( "Open3" )
5748 .getAMethodCall ( [
5849 "pipeline_rw" , "pipeline_r" , "pipeline_w" , "pipeline_start" , "pipeline"
5950 ] )
6051 }
6152
62- override DataFlow:: Node getAnArgument ( ) {
63- result .asExpr ( ) .getExpr ( ) = methodCall .getAnArgument ( )
64- }
53+ override DataFlow:: Node getAnArgument ( ) { result = super .getArgument ( _) }
6554
6655 override predicate isShellInterpreted ( DataFlow:: Node arg ) {
6756 // A command in the pipeline is executed in a subshell if it is given as a single string argument.
68- arg .asExpr ( ) .getExpr ( ) instanceof StringlikeLiteral and
69- arg . asExpr ( ) . getExpr ( ) = methodCall .getAnArgument ( )
57+ arg .asExpr ( ) .getExpr ( ) instanceof Ast :: StringlikeLiteral and
58+ arg = this .getAnArgument ( )
7059 }
7160 }
7261}
0 commit comments