Skip to content

Commit e3765ce

Browse files
committed
Python: Add tests for modification of defaults
1 parent 467aa64 commit e3765ce

File tree

3 files changed

+109
-0
lines changed

3 files changed

+109
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
edges
2+
| test.py:2:12:2:12 | empty mutable value | test.py:3:5:3:5 | empty mutable value |
3+
| test.py:7:14:7:14 | empty mutable value | test.py:9:14:9:14 | empty mutable value |
4+
| test.py:9:5:9:15 | empty mutable value | test.py:10:5:10:5 | empty mutable value |
5+
| test.py:9:14:9:14 | empty mutable value | test.py:9:5:9:15 | empty mutable value |
6+
| test.py:13:13:13:13 | empty mutable value | test.py:14:5:14:5 | empty mutable value |
7+
| test.py:18:14:18:14 | empty mutable value | test.py:19:13:19:13 | empty mutable value |
8+
| test.py:19:13:19:13 | empty mutable value | test.py:13:13:13:13 | empty mutable value |
9+
| test.py:23:14:23:14 | non-empty mutable value | test.py:24:5:24:5 | non-empty mutable value |
10+
| test.py:52:17:52:17 | empty mutable value | test.py:53:5:53:5 | empty mutable value |
11+
| test.py:57:26:57:26 | non-empty mutable value | test.py:58:5:58:5 | non-empty mutable value |
12+
| test.py:62:35:62:35 | non-empty mutable value | test.py:63:5:63:5 | non-empty mutable value |
13+
| test.py:66:21:66:21 | empty mutable value | test.py:67:5:67:5 | empty mutable value |
14+
| test.py:71:26:71:26 | empty mutable value | test.py:72:21:72:21 | empty mutable value |
15+
| test.py:72:21:72:21 | empty mutable value | test.py:66:21:66:21 | empty mutable value |
16+
| test.py:76:19:76:19 | empty mutable value | test.py:78:14:78:14 | empty mutable value |
17+
| test.py:78:5:78:15 | empty mutable value | test.py:79:5:79:5 | empty mutable value |
18+
| test.py:78:14:78:14 | empty mutable value | test.py:78:5:78:15 | empty mutable value |
19+
#select
20+
| test.py:3:5:3:5 | l | test.py:2:12:2:12 | empty mutable value | test.py:3:5:3:5 | empty mutable value | $@ flows to here and is mutated. | test.py:2:12:2:12 | l | Default value |
21+
| test.py:10:5:10:5 | x | test.py:7:14:7:14 | empty mutable value | test.py:10:5:10:5 | empty mutable value | $@ flows to here and is mutated. | test.py:7:14:7:14 | l | Default value |
22+
| test.py:14:5:14:5 | l | test.py:18:14:18:14 | empty mutable value | test.py:14:5:14:5 | empty mutable value | $@ flows to here and is mutated. | test.py:18:14:18:14 | l | Default value |
23+
| test.py:24:5:24:5 | l | test.py:23:14:23:14 | non-empty mutable value | test.py:24:5:24:5 | non-empty mutable value | $@ flows to here and is mutated. | test.py:23:14:23:14 | l | Default value |
24+
| test.py:53:5:53:5 | d | test.py:52:17:52:17 | empty mutable value | test.py:53:5:53:5 | empty mutable value | $@ flows to here and is mutated. | test.py:52:17:52:17 | d | Default value |
25+
| test.py:58:5:58:5 | d | test.py:57:26:57:26 | non-empty mutable value | test.py:58:5:58:5 | non-empty mutable value | $@ flows to here and is mutated. | test.py:57:26:57:26 | d | Default value |
26+
| test.py:63:5:63:5 | d | test.py:62:35:62:35 | non-empty mutable value | test.py:63:5:63:5 | non-empty mutable value | $@ flows to here and is mutated. | test.py:62:35:62:35 | d | Default value |
27+
| test.py:67:5:67:5 | d | test.py:71:26:71:26 | empty mutable value | test.py:67:5:67:5 | empty mutable value | $@ flows to here and is mutated. | test.py:71:26:71:26 | d | Default value |
28+
| test.py:79:5:79:5 | x | test.py:76:19:76:19 | empty mutable value | test.py:79:5:79:5 | empty mutable value | $@ flows to here and is mutated. | test.py:76:19:76:19 | d | Default value |
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Functions/ModificationOfParameterWithDefault.ql
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# Not OK
2+
def simple(l = []):
3+
l.append(1)
4+
return l
5+
6+
# OK
7+
def includes(l = []):
8+
x = [0]
9+
x.extend(l)
10+
x.extend([1]) # FP
11+
return x
12+
13+
def extends(l):
14+
l.extend([1])
15+
return l
16+
17+
# Not OK
18+
def deferred(l = []):
19+
extends(l)
20+
return l
21+
22+
# Not OK
23+
def nonempty(l = [5]):
24+
l.append(1)
25+
return l
26+
27+
# Not OK
28+
def dict(d = {}):
29+
d['a'] = 1 # FN
30+
return d
31+
32+
# Not OK
33+
def dict_nonempty(d = {'a': 1}):
34+
d['a'] = 2 # FN
35+
return d
36+
37+
# OK
38+
def dict_nonempty_nochange(d = {'a': 1}):
39+
d['a'] = 1
40+
return d
41+
42+
def modifies(d):
43+
d['a'] = 1 # FN
44+
return d
45+
46+
# Not OK
47+
def dict_deferred(d = {}):
48+
modifies(d)
49+
return d
50+
51+
# Not OK
52+
def dict_method(d = {}):
53+
d.update({'a': 1})
54+
return d
55+
56+
# Not OK
57+
def dict_method_nonempty(d = {'a': 1}):
58+
d.update({'a': 2})
59+
return d
60+
61+
# OK
62+
def dict_method_nonempty_nochange(d = {'a': 1}):
63+
d.update({'a': 1}) # FP
64+
return d
65+
66+
def modifies_method(d):
67+
d.update({'a': 1})
68+
return d
69+
70+
# Not OK
71+
def dict_deferred_method(d = {}):
72+
modifies_method(d)
73+
return d
74+
75+
# OK
76+
def dict_includes(d = {}):
77+
x = {}
78+
x.update(d)
79+
x.update({'a': 1}) # FP
80+
return x

0 commit comments

Comments
 (0)