Python: Add tests for modification of defaults

This commit is contained in:
Rasmus Lerchedahl Petersen
2021-08-23 15:29:07 +02:00
parent 467aa647da
commit e3765ced78
3 changed files with 109 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
edges
| test.py:2:12:2:12 | empty mutable value | test.py:3:5:3:5 | empty mutable value |
| test.py:7:14:7:14 | empty mutable value | test.py:9:14:9:14 | empty mutable value |
| test.py:9:5:9:15 | empty mutable value | test.py:10:5:10:5 | empty mutable value |
| test.py:9:14:9:14 | empty mutable value | test.py:9:5:9:15 | empty mutable value |
| test.py:13:13:13:13 | empty mutable value | test.py:14:5:14:5 | empty mutable value |
| test.py:18:14:18:14 | empty mutable value | test.py:19:13:19:13 | empty mutable value |
| test.py:19:13:19:13 | empty mutable value | test.py:13:13:13:13 | empty mutable value |
| test.py:23:14:23:14 | non-empty mutable value | test.py:24:5:24:5 | non-empty mutable value |
| test.py:52:17:52:17 | empty mutable value | test.py:53:5:53:5 | empty mutable value |
| test.py:57:26:57:26 | non-empty mutable value | test.py:58:5:58:5 | non-empty mutable value |
| test.py:62:35:62:35 | non-empty mutable value | test.py:63:5:63:5 | non-empty mutable value |
| test.py:66:21:66:21 | empty mutable value | test.py:67:5:67:5 | empty mutable value |
| test.py:71:26:71:26 | empty mutable value | test.py:72:21:72:21 | empty mutable value |
| test.py:72:21:72:21 | empty mutable value | test.py:66:21:66:21 | empty mutable value |
| test.py:76:19:76:19 | empty mutable value | test.py:78:14:78:14 | empty mutable value |
| test.py:78:5:78:15 | empty mutable value | test.py:79:5:79:5 | empty mutable value |
| test.py:78:14:78:14 | empty mutable value | test.py:78:5:78:15 | empty mutable value |
#select
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |
| 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 |

View File

@@ -0,0 +1 @@
Functions/ModificationOfParameterWithDefault.ql

View File

@@ -0,0 +1,80 @@
# Not OK
def simple(l = []):
l.append(1)
return l
# OK
def includes(l = []):
x = [0]
x.extend(l)
x.extend([1]) # FP
return x
def extends(l):
l.extend([1])
return l
# Not OK
def deferred(l = []):
extends(l)
return l
# Not OK
def nonempty(l = [5]):
l.append(1)
return l
# Not OK
def dict(d = {}):
d['a'] = 1 # FN
return d
# Not OK
def dict_nonempty(d = {'a': 1}):
d['a'] = 2 # FN
return d
# OK
def dict_nonempty_nochange(d = {'a': 1}):
d['a'] = 1
return d
def modifies(d):
d['a'] = 1 # FN
return d
# Not OK
def dict_deferred(d = {}):
modifies(d)
return d
# Not OK
def dict_method(d = {}):
d.update({'a': 1})
return d
# Not OK
def dict_method_nonempty(d = {'a': 1}):
d.update({'a': 2})
return d
# OK
def dict_method_nonempty_nochange(d = {'a': 1}):
d.update({'a': 1}) # FP
return d
def modifies_method(d):
d.update({'a': 1})
return d
# Not OK
def dict_deferred_method(d = {}):
modifies_method(d)
return d
# OK
def dict_includes(d = {}):
x = {}
x.update(d)
x.update({'a': 1}) # FP
return x