Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f5244aa

Browse files
committed
Python: Add testfiles
1 parent fc84286 commit f5244aa

14 files changed

Lines changed: 680 additions & 655 deletions
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
import sys
2+
import os
3+
4+
sys.path.append(os.path.dirname(os.path.dirname((__file__))))
5+
from testlib import *
6+
7+
arg = "source"
8+
arg1 = "source1"
9+
arg2 = "source2"
10+
arg3 = "source3"
11+
12+
13+
def SINK(x, expected=arg):
14+
if x == expected:
15+
print("OK")
16+
else:
17+
print("Unexpected flow", x)
18+
19+
20+
def SINK1(x):
21+
SINK(x, expected=arg1)
22+
23+
24+
def SINK2(x):
25+
SINK(x, expected=arg2)
26+
27+
28+
def SINK3(x):
29+
SINK(x, expected=arg3)
30+
31+
32+
def argument_passing(
33+
a,
34+
b,
35+
/,
36+
c,
37+
d="",
38+
*,
39+
e="",
40+
f,
41+
**g,
42+
):
43+
SINK1(a)
44+
SINK2(b)
45+
SINK3(c)
46+
SINK(f)
47+
48+
49+
@expects(4)
50+
def test_argument_passing():
51+
argument_passing(arg1, arg2, arg3, f=arg)
52+
53+
54+
def with_pos_only(a, /, b):
55+
SINK1(a)
56+
SINK2(b)
57+
58+
59+
@expects(6)
60+
def test_pos_only():
61+
with_pos_only(arg1, arg2)
62+
with_pos_only(arg1, b=arg2)
63+
with_pos_only(arg1, *(arg2,))
64+
65+
66+
def with_multiple_kw_args(a, b, c):
67+
SINK1(a)
68+
SINK2(b)
69+
SINK3(c)
70+
71+
72+
@expects(9)
73+
def test_multiple_kw_args():
74+
with_multiple_kw_args(b=arg2, c=arg3, a=arg1)
75+
with_multiple_kw_args(arg1, *(arg2,), arg3)
76+
with_multiple_kw_args(arg1, **{"c": arg3}, b=arg2)
77+
78+
79+
def with_default_arguments(a=arg1, b=arg2, c=arg3):
80+
SINK1(a)
81+
SINK2(b)
82+
SINK3(c)
83+
84+
85+
@expects(12)
86+
def test_default_arguments():
87+
with_default_arguments()
88+
with_default_arguments(arg1)
89+
with_default_arguments(b=arg2)
90+
with_default_arguments(**{"c": arg3})
91+
92+
93+
# Nested constructor pattern
94+
def grab_foo_bar_baz(foo, **kwargs):
95+
SINK1(foo)
96+
grab_bar_baz(**kwargs)
97+
98+
99+
def grab_bar_baz(bar, **kwargs):
100+
SINK2(bar)
101+
grab_baz(**kwargs)
102+
103+
104+
def grab_baz(baz):
105+
SINK3(baz)
106+
107+
108+
@expects(3)
109+
def test_grab():
110+
grab_foo_bar_baz(baz=arg3, bar=arg2, foo=arg1)
111+
112+
113+
# All combinations
114+
def test_pos_pos():
115+
def with_pos(a):
116+
SINK1(a)
117+
118+
with_pos(arg1)
119+
120+
121+
def test_pos_pos_only():
122+
def with_pos_only(a, /):
123+
SINK1(a)
124+
125+
with_pos_only(arg1)
126+
127+
128+
def test_pos_star():
129+
def with_star(*a):
130+
if len(a) > 0:
131+
SINK1(a[0])
132+
133+
with_star(arg1)
134+
135+
136+
def test_pos_kw():
137+
def with_kw(a=""):
138+
SINK1(a)
139+
140+
with_kw(arg1)
141+
142+
143+
def test_kw_pos():
144+
def with_pos(a):
145+
SINK1(a)
146+
147+
with_pos(a=arg1)
148+
149+
150+
def test_kw_kw():
151+
def with_kw(a=""):
152+
SINK1(a)
153+
154+
with_kw(a=arg1)
155+
156+
157+
def test_kw_doublestar():
158+
def with_doublestar(**a):
159+
SINK1(a["a"])
160+
161+
with_doublestar(a=arg1)
Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
1-
| classes.py:620:5:620:16 | SSA variable with_getitem | classes.py:614:15:614:18 | ControlFlowNode for self |
2-
| classes.py:637:5:637:16 | SSA variable with_setitem | classes.py:632:15:632:18 | ControlFlowNode for self |
3-
| classes.py:654:5:654:16 | SSA variable with_delitem | classes.py:649:15:649:18 | ControlFlowNode for self |
4-
| classes.py:735:5:735:12 | SSA variable with_add | classes.py:729:15:729:18 | ControlFlowNode for self |
5-
| classes.py:752:5:752:12 | SSA variable with_sub | classes.py:746:15:746:18 | ControlFlowNode for self |
6-
| classes.py:769:5:769:12 | SSA variable with_mul | classes.py:763:15:763:18 | ControlFlowNode for self |
7-
| classes.py:786:5:786:15 | SSA variable with_matmul | classes.py:780:15:780:18 | ControlFlowNode for self |
8-
| classes.py:803:5:803:16 | SSA variable with_truediv | classes.py:797:15:797:18 | ControlFlowNode for self |
9-
| classes.py:820:5:820:17 | SSA variable with_floordiv | classes.py:814:15:814:18 | ControlFlowNode for self |
10-
| classes.py:837:5:837:12 | SSA variable with_mod | classes.py:831:15:831:18 | ControlFlowNode for self |
11-
| classes.py:877:5:877:12 | SSA variable with_pow | classes.py:865:15:865:18 | ControlFlowNode for self |
12-
| classes.py:894:5:894:15 | SSA variable with_lshift | classes.py:888:15:888:18 | ControlFlowNode for self |
13-
| classes.py:911:5:911:15 | SSA variable with_rshift | classes.py:905:15:905:18 | ControlFlowNode for self |
14-
| classes.py:928:5:928:12 | SSA variable with_and | classes.py:922:15:922:18 | ControlFlowNode for self |
15-
| classes.py:945:5:945:12 | SSA variable with_xor | classes.py:939:15:939:18 | ControlFlowNode for self |
16-
| classes.py:962:5:962:11 | SSA variable with_or | classes.py:956:15:956:18 | ControlFlowNode for self |
1+
| argumentPassing.py:51:22:51:25 | ControlFlowNode for arg1 | argumentPassing.py:43:11:43:11 | ControlFlowNode for a |
2+
| argumentPassing.py:61:19:61:22 | ControlFlowNode for arg1 | argumentPassing.py:55:11:55:11 | ControlFlowNode for a |
3+
| argumentPassing.py:62:19:62:22 | ControlFlowNode for arg1 | argumentPassing.py:55:11:55:11 | ControlFlowNode for a |
4+
| argumentPassing.py:63:19:63:22 | ControlFlowNode for arg1 | argumentPassing.py:55:11:55:11 | ControlFlowNode for a |
5+
| argumentPassing.py:74:45:74:48 | ControlFlowNode for arg1 | argumentPassing.py:67:11:67:11 | ControlFlowNode for a |
6+
| argumentPassing.py:75:27:75:30 | ControlFlowNode for arg1 | argumentPassing.py:67:11:67:11 | ControlFlowNode for a |
7+
| argumentPassing.py:76:27:76:30 | ControlFlowNode for arg1 | argumentPassing.py:67:11:67:11 | ControlFlowNode for a |
8+
| argumentPassing.py:88:28:88:31 | ControlFlowNode for arg1 | argumentPassing.py:80:11:80:11 | ControlFlowNode for a |
9+
| classes.py:563:5:563:16 | SSA variable with_getitem | classes.py:557:15:557:18 | ControlFlowNode for self |
10+
| classes.py:578:5:578:16 | SSA variable with_setitem | classes.py:573:15:573:18 | ControlFlowNode for self |
11+
| classes.py:593:5:593:16 | SSA variable with_delitem | classes.py:588:15:588:18 | ControlFlowNode for self |
12+
| classes.py:665:5:665:12 | SSA variable with_add | classes.py:659:15:659:18 | ControlFlowNode for self |
13+
| classes.py:680:5:680:12 | SSA variable with_sub | classes.py:674:15:674:18 | ControlFlowNode for self |
14+
| classes.py:695:5:695:12 | SSA variable with_mul | classes.py:689:15:689:18 | ControlFlowNode for self |
15+
| classes.py:710:5:710:15 | SSA variable with_matmul | classes.py:704:15:704:18 | ControlFlowNode for self |
16+
| classes.py:725:5:725:16 | SSA variable with_truediv | classes.py:719:15:719:18 | ControlFlowNode for self |
17+
| classes.py:740:5:740:17 | SSA variable with_floordiv | classes.py:734:15:734:18 | ControlFlowNode for self |
18+
| classes.py:755:5:755:12 | SSA variable with_mod | classes.py:749:15:749:18 | ControlFlowNode for self |
19+
| classes.py:791:5:791:12 | SSA variable with_pow | classes.py:779:15:779:18 | ControlFlowNode for self |
20+
| classes.py:806:5:806:15 | SSA variable with_lshift | classes.py:800:15:800:18 | ControlFlowNode for self |
21+
| classes.py:821:5:821:15 | SSA variable with_rshift | classes.py:815:15:815:18 | ControlFlowNode for self |
22+
| classes.py:836:5:836:12 | SSA variable with_and | classes.py:830:15:830:18 | ControlFlowNode for self |
23+
| classes.py:851:5:851:12 | SSA variable with_xor | classes.py:845:15:845:18 | ControlFlowNode for self |
24+
| classes.py:866:5:866:11 | SSA variable with_or | classes.py:860:15:860:18 | ControlFlowNode for self |

python/ql/test/experimental/dataflow/coverage/argumentRouting1.ql

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ class ArgumentRoutingConfig extends DataFlow::Configuration {
99
ArgumentRoutingConfig() { this = "ArgumentRoutingConfig" }
1010

1111
override predicate isSource(DataFlow::Node node) {
12+
node.(DataFlow::CfgNode).getNode().(NameNode).getId() = "arg1"
13+
or
1214
exists(AssignmentDefinition def, DataFlowPrivate::DataFlowCall call |
1315
def.getVariable() = node.(DataFlow::EssaNode).getVar() and
1416
def.getValue() = call.getNode() and
@@ -27,7 +29,7 @@ class ArgumentRoutingConfig extends DataFlow::Configuration {
2729

2830
from DataFlow::Node source, DataFlow::Node sink
2931
where
30-
source.getLocation().getFile().getBaseName() = "classes.py" and
31-
sink.getLocation().getFile().getBaseName() = "classes.py" and
32+
source.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
33+
sink.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
3234
exists(ArgumentRoutingConfig cfg | cfg.hasFlow(source, sink))
3335
select source, sink
Lines changed: 18 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
| classes.py:622:18:622:21 | ControlFlowNode for arg2 | classes.py:613:15:613:17 | ControlFlowNode for key |
2-
| classes.py:640:18:640:21 | ControlFlowNode for arg2 | classes.py:631:15:631:17 | ControlFlowNode for key |
3-
| classes.py:656:22:656:25 | ControlFlowNode for arg2 | classes.py:648:15:648:17 | ControlFlowNode for key |
4-
| classes.py:737:16:737:19 | ControlFlowNode for arg2 | classes.py:728:15:728:19 | ControlFlowNode for other |
5-
| classes.py:754:16:754:19 | ControlFlowNode for arg2 | classes.py:745:15:745:19 | ControlFlowNode for other |
6-
| classes.py:771:16:771:19 | ControlFlowNode for arg2 | classes.py:762:15:762:19 | ControlFlowNode for other |
7-
| classes.py:788:19:788:22 | ControlFlowNode for arg2 | classes.py:779:15:779:19 | ControlFlowNode for other |
8-
| classes.py:805:20:805:23 | ControlFlowNode for arg2 | classes.py:796:15:796:19 | ControlFlowNode for other |
9-
| classes.py:822:22:822:25 | ControlFlowNode for arg2 | classes.py:813:15:813:19 | ControlFlowNode for other |
10-
| classes.py:839:16:839:19 | ControlFlowNode for arg2 | classes.py:830:15:830:19 | ControlFlowNode for other |
11-
| classes.py:879:17:879:20 | ControlFlowNode for arg2 | classes.py:864:15:864:19 | ControlFlowNode for other |
12-
| classes.py:896:20:896:23 | ControlFlowNode for arg2 | classes.py:887:15:887:19 | ControlFlowNode for other |
13-
| classes.py:913:20:913:23 | ControlFlowNode for arg2 | classes.py:904:15:904:19 | ControlFlowNode for other |
14-
| classes.py:930:16:930:19 | ControlFlowNode for arg2 | classes.py:921:15:921:19 | ControlFlowNode for other |
15-
| classes.py:947:16:947:19 | ControlFlowNode for arg2 | classes.py:938:15:938:19 | ControlFlowNode for other |
16-
| classes.py:964:15:964:18 | ControlFlowNode for arg2 | classes.py:955:15:955:19 | ControlFlowNode for other |
1+
| argumentPassing.py:51:28:51:31 | ControlFlowNode for arg2 | argumentPassing.py:44:11:44:11 | ControlFlowNode for b |
2+
| argumentPassing.py:61:25:61:28 | ControlFlowNode for arg2 | argumentPassing.py:56:11:56:11 | ControlFlowNode for b |
3+
| classes.py:565:18:565:21 | ControlFlowNode for arg2 | classes.py:556:15:556:17 | ControlFlowNode for key |
4+
| classes.py:581:18:581:21 | ControlFlowNode for arg2 | classes.py:572:15:572:17 | ControlFlowNode for key |
5+
| classes.py:595:22:595:25 | ControlFlowNode for arg2 | classes.py:587:15:587:17 | ControlFlowNode for key |
6+
| classes.py:667:16:667:19 | ControlFlowNode for arg2 | classes.py:658:15:658:19 | ControlFlowNode for other |
7+
| classes.py:682:16:682:19 | ControlFlowNode for arg2 | classes.py:673:15:673:19 | ControlFlowNode for other |
8+
| classes.py:697:16:697:19 | ControlFlowNode for arg2 | classes.py:688:15:688:19 | ControlFlowNode for other |
9+
| classes.py:712:19:712:22 | ControlFlowNode for arg2 | classes.py:703:15:703:19 | ControlFlowNode for other |
10+
| classes.py:727:20:727:23 | ControlFlowNode for arg2 | classes.py:718:15:718:19 | ControlFlowNode for other |
11+
| classes.py:742:22:742:25 | ControlFlowNode for arg2 | classes.py:733:15:733:19 | ControlFlowNode for other |
12+
| classes.py:757:16:757:19 | ControlFlowNode for arg2 | classes.py:748:15:748:19 | ControlFlowNode for other |
13+
| classes.py:793:17:793:20 | ControlFlowNode for arg2 | classes.py:778:15:778:19 | ControlFlowNode for other |
14+
| classes.py:808:20:808:23 | ControlFlowNode for arg2 | classes.py:799:15:799:19 | ControlFlowNode for other |
15+
| classes.py:823:20:823:23 | ControlFlowNode for arg2 | classes.py:814:15:814:19 | ControlFlowNode for other |
16+
| classes.py:838:16:838:19 | ControlFlowNode for arg2 | classes.py:829:15:829:19 | ControlFlowNode for other |
17+
| classes.py:853:16:853:19 | ControlFlowNode for arg2 | classes.py:844:15:844:19 | ControlFlowNode for other |
18+
| classes.py:868:15:868:18 | ControlFlowNode for arg2 | classes.py:859:15:859:19 | ControlFlowNode for other |

python/ql/test/experimental/dataflow/coverage/argumentRouting2.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class ArgumentRoutingConfig extends DataFlow::Configuration {
2121

2222
from DataFlow::Node source, DataFlow::Node sink
2323
where
24-
source.getLocation().getFile().getBaseName() = "classes.py" and
25-
sink.getLocation().getFile().getBaseName() = "classes.py" and
24+
source.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
25+
sink.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
2626
exists(ArgumentRoutingConfig cfg | cfg.hasFlow(source, sink))
2727
select source, sink
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
| classes.py:640:26:640:29 | ControlFlowNode for arg3 | classes.py:630:15:630:19 | ControlFlowNode for value |
1+
| argumentPassing.py:51:34:51:37 | ControlFlowNode for arg3 | argumentPassing.py:45:11:45:11 | ControlFlowNode for c |
2+
| classes.py:581:26:581:29 | ControlFlowNode for arg3 | classes.py:571:15:571:19 | ControlFlowNode for value |

python/ql/test/experimental/dataflow/coverage/argumentRouting3.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class ArgumentRoutingConfig extends DataFlow::Configuration {
2121

2222
from DataFlow::Node source, DataFlow::Node sink
2323
where
24-
source.getLocation().getFile().getBaseName() = "classes.py" and
25-
sink.getLocation().getFile().getBaseName() = "classes.py" and
24+
source.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
25+
sink.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
2626
exists(ArgumentRoutingConfig cfg | cfg.hasFlow(source, sink))
2727
select source, sink

python/ql/test/experimental/dataflow/coverage/argumentRouting4.ql

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ class ArgumentRoutingConfig extends DataFlow::Configuration {
2121

2222
from DataFlow::Node source, DataFlow::Node sink
2323
where
24-
source.getLocation().getFile().getBaseName() = "classes.py" and
25-
sink.getLocation().getFile().getBaseName() = "classes.py" and
24+
source.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
25+
sink.getLocation().getFile().getBaseName() in ["classes.py", "argumentPassing.py"] and
2626
exists(ArgumentRoutingConfig cfg | cfg.hasFlow(source, sink))
2727
select source, sink

0 commit comments

Comments
 (0)