@@ -3,19 +3,22 @@ import semmle.python.dataflow.new.DataFlow
33private import semmle.python.dataflow.new.internal.DataFlowPrivate as DataFlowPrivate
44import experimental.dataflow.TestUtil.RoutingTest
55
6- class Argument1RoutingTest extends RoutingTest {
7- Argument1RoutingTest ( ) { this = "Argument1RoutingTest" }
8-
9- override string flowTag ( ) { result = "arg1" }
10-
11- override predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink ) {
12- exists ( Argument1ExtraRoutingConfig cfg | cfg .hasFlow ( source , sink ) )
13- or
14- exists ( ArgumentRoutingConfig cfg |
15- cfg .hasFlow ( source , sink ) and
16- cfg .isArgSource ( source , 1 ) and
17- cfg .isGoodSink ( sink , 1 )
18- )
6+ module Argument1RoutingTest implements RoutingTestSig {
7+ class Argument = Unit ;
8+
9+ string flowTag ( Argument arg ) { result = "arg1" and exists ( arg ) }
10+
11+ predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink , Argument arg ) {
12+ (
13+ exists ( Argument1ExtraRoutingConfig cfg | cfg .hasFlow ( source , sink ) )
14+ or
15+ exists ( ArgumentRoutingConfig cfg |
16+ cfg .hasFlow ( source , sink ) and
17+ cfg .isArgSource ( source , 1 ) and
18+ cfg .isGoodSink ( sink , 1 )
19+ )
20+ ) and
21+ exists ( arg )
1922 }
2023}
2124
@@ -87,59 +90,54 @@ class Argument1ExtraRoutingConfig extends DataFlow::Configuration {
8790 override predicate isBarrierIn ( DataFlow:: Node node ) { this .isSource ( node ) }
8891}
8992
90- class RestArgumentRoutingTest extends RoutingTest {
91- ArgNumber argNumber ;
93+ module RestArgumentRoutingTest implements RoutingTestSig {
94+ class Argument = ArgNumber ;
9295
93- RestArgumentRoutingTest ( ) {
94- argNumber > 1 and
95- this = "Argument" + argNumber + "RoutingTest"
96- }
97-
98- override string flowTag ( ) { result = "arg" + argNumber }
96+ string flowTag ( Argument arg ) { result = "arg" + arg }
9997
100- override predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink ) {
98+ predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink , Argument arg ) {
10199 exists ( ArgumentRoutingConfig cfg |
102100 cfg .hasFlow ( source , sink ) and
103- cfg .isArgSource ( source , argNumber ) and
104- cfg .isGoodSink ( sink , argNumber )
105- )
101+ cfg .isArgSource ( source , arg ) and
102+ cfg .isGoodSink ( sink , arg )
103+ ) and
104+ arg > 1
106105 }
107106}
108107
109108/** Bad flow from `arg<n>` to `SINK<N>_F` */
110- class BadArgumentRoutingTestSinkF extends RoutingTest {
111- ArgNumber argNumber ;
109+ module BadArgumentRoutingTestSinkF implements RoutingTestSig {
110+ class Argument = ArgNumber ;
112111
113- BadArgumentRoutingTestSinkF ( ) { this = "BadArgumentRoutingTestSinkF " + argNumber }
112+ string flowTag ( Argument arg ) { result = "bad " + arg }
114113
115- override string flowTag ( ) { result = "bad" + argNumber }
116-
117- override predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink ) {
114+ predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink , Argument arg ) {
118115 exists ( ArgumentRoutingConfig cfg |
119116 cfg .hasFlow ( source , sink ) and
120- cfg .isArgSource ( source , argNumber ) and
121- cfg .isBadSink ( sink , argNumber )
117+ cfg .isArgSource ( source , arg ) and
118+ cfg .isBadSink ( sink , arg )
122119 )
123120 }
124121}
125122
126123/** Bad flow from `arg<n>` to `SINK<M>` or `SINK<M>_F`, where `n != m`. */
127- class BadArgumentRoutingTestWrongSink extends RoutingTest {
128- ArgNumber argNumber ;
129-
130- BadArgumentRoutingTestWrongSink ( ) { this = "BadArgumentRoutingTestWrongSink" + argNumber }
124+ module BadArgumentRoutingTestWrongSink implements RoutingTestSig {
125+ class Argument = ArgNumber ;
131126
132- override string flowTag ( ) { result = "bad" + argNumber }
127+ string flowTag ( Argument arg ) { result = "bad" + arg }
133128
134- override predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink ) {
129+ predicate relevantFlow ( DataFlow:: Node source , DataFlow:: Node sink , Argument arg ) {
135130 exists ( ArgumentRoutingConfig cfg |
136131 cfg .hasFlow ( source , sink ) and
137- cfg .isArgSource ( source , any ( ArgNumber i | not i = argNumber ) ) and
132+ cfg .isArgSource ( source , any ( ArgNumber i | not i = arg ) ) and
138133 (
139- cfg .isGoodSink ( sink , argNumber )
134+ cfg .isGoodSink ( sink , arg )
140135 or
141- cfg .isBadSink ( sink , argNumber )
136+ cfg .isBadSink ( sink , arg )
142137 )
143138 )
144139 }
145140}
141+
142+ import MakeTest< MergeTests4< MakeTestSig< Argument1RoutingTest > , MakeTestSig< RestArgumentRoutingTest > ,
143+ MakeTestSig< BadArgumentRoutingTestSinkF > , MakeTestSig< BadArgumentRoutingTestWrongSink > > >
0 commit comments