Skip to content

Commit 3c82653

Browse files
committed
Python: Highlight missing post-update flow for *args and **kwargs
1 parent f05c862 commit 3c82653

File tree

1 file changed

+66
-0
lines changed

1 file changed

+66
-0
lines changed

python/ql/test/experimental/dataflow/coverage/argumentPassing.py

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
sys.path.append(os.path.dirname(os.path.dirname((__file__))))
66
from testlib import expects
77

8+
SOURCE = "source"
89
arg = "source"
910
arg1 = "source1"
1011
arg2 = "source2"
@@ -269,3 +270,68 @@ def test_stararg_mixed():
269270
starargs_mixed(arg1, *args, *empty_args) # $ arg1
270271
args = (arg2, "safe")
271272
starargs_mixed(arg1, *empty_args, *args) # $ arg1 MISSING: arg2
273+
274+
# ------------------------------------------------------------------------------
275+
# Test updating field of argument
276+
# ------------------------------------------------------------------------------
277+
278+
class MyClass: pass
279+
280+
def kwargsSideEffect(**kwargs):
281+
kwargs["a"].foo = kwargs["b"]
282+
283+
@expects(2)
284+
def test_kwargsSideEffect():
285+
a = MyClass()
286+
kwargs = {"a": a, "b": SOURCE}
287+
kwargsSideEffect(**kwargs)
288+
SINK(a.foo) # $ MISSING: flow
289+
290+
a = MyClass()
291+
kwargsSideEffect(a=a, b=SOURCE)
292+
SINK(a.foo) # $ MISSING: flow
293+
294+
295+
def keywordArgSideEffect(a, b):
296+
a.foo = b
297+
298+
@expects(2)
299+
def test_keywordArgSideEffect():
300+
a = MyClass()
301+
kwargs = {"a": a, "b": SOURCE}
302+
keywordArgSideEffect(**kwargs)
303+
SINK(a.foo) # $ MISSING: flow
304+
305+
a = MyClass()
306+
keywordArgSideEffect(a=a, b=SOURCE)
307+
SINK(a.foo) # $ flow="SOURCE, l:-1 -> a.foo"
308+
309+
310+
def starargsSideEffect(*args):
311+
args[0].foo = args[1]
312+
313+
@expects(2)
314+
def test_starargsSideEffect():
315+
a = MyClass()
316+
args = (a, SOURCE)
317+
starargsSideEffect(*args)
318+
SINK(a.foo) # $ MISSING: flow
319+
320+
a = MyClass()
321+
starargsSideEffect(a, SOURCE)
322+
SINK(a.foo) # $ MISSING: flow
323+
324+
325+
def positionalArgSideEffect(a, b):
326+
a.foo = b
327+
328+
@expects(2)
329+
def test_positionalArgSideEffect():
330+
a = MyClass()
331+
args = (a, SOURCE)
332+
positionalArgSideEffect(*args)
333+
SINK(a.foo) # $ MISSING: flow
334+
335+
a = MyClass()
336+
positionalArgSideEffect(a, SOURCE)
337+
SINK(a.foo) # $ flow="SOURCE, l:-1 -> a.foo"

0 commit comments

Comments
 (0)