mirror of
https://github.com/github/codeql.git
synced 2026-05-01 11:45:14 +02:00
Python: Add tests for modification of defaults
This commit is contained in:
@@ -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 |
|
||||
@@ -0,0 +1 @@
|
||||
Functions/ModificationOfParameterWithDefault.ql
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user