Skip to content

Commit 0841e92

Browse files
committed
Python: Test for method call
1 parent 5326125 commit 0841e92

File tree

7 files changed

+833
-702
lines changed

7 files changed

+833
-702
lines changed

python/ql/test/experimental/dataflow/fieldflow/allLocalFlow.expected

Lines changed: 88 additions & 75 deletions
Large diffs are not rendered by default.

python/ql/test/experimental/dataflow/fieldflow/dataflow.expected

Lines changed: 69 additions & 64 deletions
Large diffs are not rendered by default.

python/ql/test/experimental/dataflow/fieldflow/examples.py

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
22

33
# Preamble
44

5-
class MyObj(object):
65

6+
class MyObj(object):
77
def __init__(self, foo):
88
self.foo = foo
99

1010

1111
class NestedObj(object):
12-
1312
def __init__(self):
1413
self.obj = MyObj("OK")
1514

@@ -22,6 +21,7 @@ def setFoo(obj, x):
2221
SINK_F(obj.foo)
2322
obj.foo = x
2423

24+
2525
myobj = MyObj("OK")
2626

2727
setFoo(myobj, SOURCE)
@@ -33,18 +33,27 @@ def setFoo(obj, x):
3333
a = NestedObj()
3434

3535
a.obj.foo = x
36-
a.getObj().foo = x
3736

3837
SINK(a.obj.foo)
3938

39+
# Example 2 with method call
40+
x = SOURCE
41+
42+
a = NestedObj()
43+
44+
a.getObj().foo = x
45+
46+
SINK(a.obj.foo) # Flow missing
47+
4048
# Example 3
4149
obj = MyObj(SOURCE)
4250
SINK(obj.foo)
4351

4452
# Local flow
4553
def fields_with_local_flow(x):
46-
obj = MyObj(x)
47-
a = obj.foo
48-
return a
54+
obj = MyObj(x)
55+
a = obj.foo
56+
return a
57+
4958

50-
SINK(fields_with_local_flow(SOURCE))
59+
SINK(fields_with_local_flow(SOURCE))

python/ql/test/experimental/dataflow/fieldflow/globalStep.expected

Lines changed: 594 additions & 506 deletions
Large diffs are not rendered by default.
Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
| examples.py:45:1:45:30 | GSSA Variable MyObj | examples.py:46:9:46:13 | ControlFlowNode for MyObj |
2-
| examples.py:45:28:45:28 | SSA variable x | examples.py:46:9:46:16 | SSA variable x |
3-
| examples.py:45:28:45:28 | SSA variable x | examples.py:46:15:46:15 | ControlFlowNode for x |
4-
| examples.py:46:3:46:5 | SSA variable obj | examples.py:47:7:47:9 | ControlFlowNode for obj |
5-
| examples.py:46:9:46:16 | ControlFlowNode for MyObj() | examples.py:46:3:46:5 | SSA variable obj |
6-
| examples.py:47:3:47:3 | SSA variable a | examples.py:48:10:48:10 | ControlFlowNode for a |
7-
| examples.py:47:7:47:13 | ControlFlowNode for Attribute | examples.py:47:3:47:3 | SSA variable a |
8-
| test.py:71:1:71:30 | GSSA Variable MyObj | test.py:72:11:72:15 | ControlFlowNode for MyObj |
9-
| test.py:71:28:71:28 | SSA variable x | test.py:72:11:72:18 | SSA variable x |
10-
| test.py:71:28:71:28 | SSA variable x | test.py:72:17:72:17 | ControlFlowNode for x |
11-
| test.py:72:5:72:7 | SSA variable obj | test.py:73:9:73:11 | ControlFlowNode for obj |
12-
| test.py:72:11:72:18 | ControlFlowNode for MyObj() | test.py:72:5:72:7 | SSA variable obj |
13-
| test.py:73:5:73:5 | SSA variable a | test.py:74:12:74:12 | ControlFlowNode for a |
14-
| test.py:73:9:73:15 | ControlFlowNode for Attribute | test.py:73:5:73:5 | SSA variable a |
1+
| examples.py:53:1:53:30 | GSSA Variable MyObj | examples.py:54:11:54:15 | ControlFlowNode for MyObj |
2+
| examples.py:53:28:53:28 | SSA variable x | examples.py:54:11:54:18 | SSA variable x |
3+
| examples.py:53:28:53:28 | SSA variable x | examples.py:54:17:54:17 | ControlFlowNode for x |
4+
| examples.py:54:5:54:7 | SSA variable obj | examples.py:55:9:55:11 | ControlFlowNode for obj |
5+
| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:54:5:54:7 | SSA variable obj |
6+
| examples.py:55:5:55:5 | SSA variable a | examples.py:56:12:56:12 | ControlFlowNode for a |
7+
| examples.py:55:9:55:15 | ControlFlowNode for Attribute | examples.py:55:5:55:5 | SSA variable a |
8+
| test.py:80:1:80:30 | GSSA Variable MyObj | test.py:81:11:81:15 | ControlFlowNode for MyObj |
9+
| test.py:80:28:80:28 | SSA variable x | test.py:81:11:81:18 | SSA variable x |
10+
| test.py:80:28:80:28 | SSA variable x | test.py:81:17:81:17 | ControlFlowNode for x |
11+
| test.py:81:5:81:7 | SSA variable obj | test.py:82:9:82:11 | ControlFlowNode for obj |
12+
| test.py:81:11:81:18 | ControlFlowNode for MyObj() | test.py:81:5:81:7 | SSA variable obj |
13+
| test.py:82:5:82:5 | SSA variable a | test.py:83:12:83:12 | ControlFlowNode for a |
14+
| test.py:82:9:82:15 | ControlFlowNode for Attribute | test.py:82:5:82:5 | SSA variable a |
Lines changed: 42 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
| examples.py:8:9:8:12 | [post store] ControlFlowNode for self | examples.py:8:9:8:12 | ControlFlowNode for self |
2-
| examples.py:14:9:14:12 | [post store] ControlFlowNode for self | examples.py:14:9:14:12 | ControlFlowNode for self |
3-
| examples.py:14:20:14:30 | ControlFlowNode for MyObj() | examples.py:14:20:14:30 | [pre objCreate] ControlFlowNode for MyObj() |
4-
| examples.py:14:26:14:29 | [post arg] ControlFlowNode for Str | examples.py:14:26:14:29 | ControlFlowNode for Str |
5-
| examples.py:17:16:17:19 | [post read] ControlFlowNode for self | examples.py:17:16:17:19 | ControlFlowNode for self |
6-
| examples.py:22:12:22:14 | [post read] ControlFlowNode for obj | examples.py:22:12:22:14 | ControlFlowNode for obj |
7-
| examples.py:23:5:23:7 | [post store] ControlFlowNode for obj | examples.py:23:5:23:7 | ControlFlowNode for obj |
2+
| examples.py:13:9:13:12 | [post store] ControlFlowNode for self | examples.py:13:9:13:12 | ControlFlowNode for self |
3+
| examples.py:13:20:13:30 | ControlFlowNode for MyObj() | examples.py:13:20:13:30 | [pre objCreate] ControlFlowNode for MyObj() |
4+
| examples.py:13:26:13:29 | [post arg] ControlFlowNode for Str | examples.py:13:26:13:29 | ControlFlowNode for Str |
5+
| examples.py:16:16:16:19 | [post read] ControlFlowNode for self | examples.py:16:16:16:19 | ControlFlowNode for self |
6+
| examples.py:21:12:21:14 | [post read] ControlFlowNode for obj | examples.py:21:12:21:14 | ControlFlowNode for obj |
7+
| examples.py:22:5:22:7 | [post store] ControlFlowNode for obj | examples.py:22:5:22:7 | ControlFlowNode for obj |
88
| examples.py:25:9:25:19 | ControlFlowNode for MyObj() | examples.py:25:9:25:19 | [pre objCreate] ControlFlowNode for MyObj() |
99
| examples.py:25:15:25:18 | [post arg] ControlFlowNode for Str | examples.py:25:15:25:18 | ControlFlowNode for Str |
1010
| examples.py:27:8:27:12 | [post arg] ControlFlowNode for myobj | examples.py:27:8:27:12 | ControlFlowNode for myobj |
@@ -13,17 +13,20 @@
1313
| examples.py:33:5:33:15 | ControlFlowNode for NestedObj() | examples.py:33:5:33:15 | [pre objCreate] ControlFlowNode for NestedObj() |
1414
| examples.py:35:1:35:1 | [post read] ControlFlowNode for a | examples.py:35:1:35:1 | ControlFlowNode for a |
1515
| examples.py:35:1:35:5 | [post store] ControlFlowNode for Attribute | examples.py:35:1:35:5 | ControlFlowNode for Attribute |
16-
| examples.py:36:1:36:1 | [post read] ControlFlowNode for a | examples.py:36:1:36:1 | ControlFlowNode for a |
17-
| examples.py:36:1:36:10 | [post store] ControlFlowNode for Attribute() | examples.py:36:1:36:10 | ControlFlowNode for Attribute() |
18-
| examples.py:38:6:38:6 | [post read] ControlFlowNode for a | examples.py:38:6:38:6 | ControlFlowNode for a |
19-
| examples.py:38:6:38:10 | [post read] ControlFlowNode for Attribute | examples.py:38:6:38:10 | ControlFlowNode for Attribute |
20-
| examples.py:41:7:41:19 | ControlFlowNode for MyObj() | examples.py:41:7:41:19 | [pre objCreate] ControlFlowNode for MyObj() |
21-
| examples.py:41:13:41:18 | [post arg] ControlFlowNode for SOURCE | examples.py:41:13:41:18 | ControlFlowNode for SOURCE |
22-
| examples.py:42:6:42:8 | [post read] ControlFlowNode for obj | examples.py:42:6:42:8 | ControlFlowNode for obj |
23-
| examples.py:46:9:46:16 | ControlFlowNode for MyObj() | examples.py:46:9:46:16 | [pre objCreate] ControlFlowNode for MyObj() |
24-
| examples.py:46:15:46:15 | [post arg] ControlFlowNode for x | examples.py:46:15:46:15 | ControlFlowNode for x |
25-
| examples.py:47:7:47:9 | [post read] ControlFlowNode for obj | examples.py:47:7:47:9 | ControlFlowNode for obj |
26-
| examples.py:50:29:50:34 | [post arg] ControlFlowNode for SOURCE | examples.py:50:29:50:34 | ControlFlowNode for SOURCE |
16+
| examples.py:37:6:37:6 | [post read] ControlFlowNode for a | examples.py:37:6:37:6 | ControlFlowNode for a |
17+
| examples.py:37:6:37:10 | [post read] ControlFlowNode for Attribute | examples.py:37:6:37:10 | ControlFlowNode for Attribute |
18+
| examples.py:42:5:42:15 | ControlFlowNode for NestedObj() | examples.py:42:5:42:15 | [pre objCreate] ControlFlowNode for NestedObj() |
19+
| examples.py:44:1:44:1 | [post read] ControlFlowNode for a | examples.py:44:1:44:1 | ControlFlowNode for a |
20+
| examples.py:44:1:44:10 | [post store] ControlFlowNode for Attribute() | examples.py:44:1:44:10 | ControlFlowNode for Attribute() |
21+
| examples.py:46:6:46:6 | [post read] ControlFlowNode for a | examples.py:46:6:46:6 | ControlFlowNode for a |
22+
| examples.py:46:6:46:10 | [post read] ControlFlowNode for Attribute | examples.py:46:6:46:10 | ControlFlowNode for Attribute |
23+
| examples.py:49:7:49:19 | ControlFlowNode for MyObj() | examples.py:49:7:49:19 | [pre objCreate] ControlFlowNode for MyObj() |
24+
| examples.py:49:13:49:18 | [post arg] ControlFlowNode for SOURCE | examples.py:49:13:49:18 | ControlFlowNode for SOURCE |
25+
| examples.py:50:6:50:8 | [post read] ControlFlowNode for obj | examples.py:50:6:50:8 | ControlFlowNode for obj |
26+
| examples.py:54:11:54:18 | ControlFlowNode for MyObj() | examples.py:54:11:54:18 | [pre objCreate] ControlFlowNode for MyObj() |
27+
| examples.py:54:17:54:17 | [post arg] ControlFlowNode for x | examples.py:54:17:54:17 | ControlFlowNode for x |
28+
| examples.py:55:9:55:11 | [post read] ControlFlowNode for obj | examples.py:55:9:55:11 | ControlFlowNode for obj |
29+
| examples.py:59:29:59:34 | [post arg] ControlFlowNode for SOURCE | examples.py:59:29:59:34 | ControlFlowNode for SOURCE |
2730
| test.py:11:18:11:18 | [post arg] ControlFlowNode for x | test.py:11:18:11:18 | ControlFlowNode for x |
2831
| test.py:18:18:18:18 | [post arg] ControlFlowNode for x | test.py:18:18:18:18 | ControlFlowNode for x |
2932
| test.py:19:15:19:31 | [post arg] ControlFlowNode for Str | test.py:19:15:19:31 | ControlFlowNode for Str |
@@ -46,21 +49,25 @@
4649
| test.py:53:9:53:19 | ControlFlowNode for NestedObj() | test.py:53:9:53:19 | [pre objCreate] ControlFlowNode for NestedObj() |
4750
| test.py:55:5:55:5 | [post read] ControlFlowNode for a | test.py:55:5:55:5 | ControlFlowNode for a |
4851
| test.py:55:5:55:9 | [post store] ControlFlowNode for Attribute | test.py:55:5:55:9 | ControlFlowNode for Attribute |
49-
| test.py:56:5:56:5 | [post read] ControlFlowNode for a | test.py:56:5:56:5 | ControlFlowNode for a |
50-
| test.py:56:5:56:14 | [post store] ControlFlowNode for Attribute() | test.py:56:5:56:14 | ControlFlowNode for Attribute() |
51-
| test.py:58:10:58:10 | [post read] ControlFlowNode for a | test.py:58:10:58:10 | ControlFlowNode for a |
52-
| test.py:58:10:58:14 | [post read] ControlFlowNode for Attribute | test.py:58:10:58:14 | ControlFlowNode for Attribute |
53-
| test.py:58:10:58:18 | [post arg] ControlFlowNode for Attribute | test.py:58:10:58:18 | ControlFlowNode for Attribute |
54-
| test.py:62:11:62:23 | ControlFlowNode for MyObj() | test.py:62:11:62:23 | [pre objCreate] ControlFlowNode for MyObj() |
55-
| test.py:62:17:62:22 | [post arg] ControlFlowNode for SOURCE | test.py:62:17:62:22 | ControlFlowNode for SOURCE |
56-
| test.py:63:10:63:12 | [post read] ControlFlowNode for obj | test.py:63:10:63:12 | ControlFlowNode for obj |
57-
| test.py:63:10:63:16 | [post arg] ControlFlowNode for Attribute | test.py:63:10:63:16 | ControlFlowNode for Attribute |
58-
| test.py:67:11:67:27 | ControlFlowNode for MyObj() | test.py:67:11:67:27 | [pre objCreate] ControlFlowNode for MyObj() |
59-
| test.py:67:21:67:26 | [post arg] ControlFlowNode for SOURCE | test.py:67:21:67:26 | ControlFlowNode for SOURCE |
60-
| test.py:68:10:68:12 | [post read] ControlFlowNode for obj | test.py:68:10:68:12 | ControlFlowNode for obj |
61-
| test.py:68:10:68:16 | [post arg] ControlFlowNode for Attribute | test.py:68:10:68:16 | ControlFlowNode for Attribute |
62-
| test.py:72:11:72:18 | ControlFlowNode for MyObj() | test.py:72:11:72:18 | [pre objCreate] ControlFlowNode for MyObj() |
63-
| test.py:72:17:72:17 | [post arg] ControlFlowNode for x | test.py:72:17:72:17 | ControlFlowNode for x |
64-
| test.py:73:9:73:11 | [post read] ControlFlowNode for obj | test.py:73:9:73:11 | ControlFlowNode for obj |
65-
| test.py:78:10:78:39 | [post arg] ControlFlowNode for fields_with_local_flow() | test.py:78:10:78:39 | ControlFlowNode for fields_with_local_flow() |
66-
| test.py:78:33:78:38 | [post arg] ControlFlowNode for SOURCE | test.py:78:33:78:38 | ControlFlowNode for SOURCE |
52+
| test.py:57:10:57:10 | [post read] ControlFlowNode for a | test.py:57:10:57:10 | ControlFlowNode for a |
53+
| test.py:57:10:57:14 | [post read] ControlFlowNode for Attribute | test.py:57:10:57:14 | ControlFlowNode for Attribute |
54+
| test.py:57:10:57:18 | [post arg] ControlFlowNode for Attribute | test.py:57:10:57:18 | ControlFlowNode for Attribute |
55+
| test.py:63:9:63:19 | ControlFlowNode for NestedObj() | test.py:63:9:63:19 | [pre objCreate] ControlFlowNode for NestedObj() |
56+
| test.py:65:5:65:5 | [post read] ControlFlowNode for a | test.py:65:5:65:5 | ControlFlowNode for a |
57+
| test.py:65:5:65:14 | [post store] ControlFlowNode for Attribute() | test.py:65:5:65:14 | ControlFlowNode for Attribute() |
58+
| test.py:67:10:67:10 | [post read] ControlFlowNode for a | test.py:67:10:67:10 | ControlFlowNode for a |
59+
| test.py:67:10:67:14 | [post read] ControlFlowNode for Attribute | test.py:67:10:67:14 | ControlFlowNode for Attribute |
60+
| test.py:67:10:67:18 | [post arg] ControlFlowNode for Attribute | test.py:67:10:67:18 | ControlFlowNode for Attribute |
61+
| test.py:71:11:71:23 | ControlFlowNode for MyObj() | test.py:71:11:71:23 | [pre objCreate] ControlFlowNode for MyObj() |
62+
| test.py:71:17:71:22 | [post arg] ControlFlowNode for SOURCE | test.py:71:17:71:22 | ControlFlowNode for SOURCE |
63+
| test.py:72:10:72:12 | [post read] ControlFlowNode for obj | test.py:72:10:72:12 | ControlFlowNode for obj |
64+
| test.py:72:10:72:16 | [post arg] ControlFlowNode for Attribute | test.py:72:10:72:16 | ControlFlowNode for Attribute |
65+
| test.py:76:11:76:27 | ControlFlowNode for MyObj() | test.py:76:11:76:27 | [pre objCreate] ControlFlowNode for MyObj() |
66+
| test.py:76:21:76:26 | [post arg] ControlFlowNode for SOURCE | test.py:76:21:76:26 | ControlFlowNode for SOURCE |
67+
| test.py:77:10:77:12 | [post read] ControlFlowNode for obj | test.py:77:10:77:12 | ControlFlowNode for obj |
68+
| test.py:77:10:77:16 | [post arg] ControlFlowNode for Attribute | test.py:77:10:77:16 | ControlFlowNode for Attribute |
69+
| test.py:81:11:81:18 | ControlFlowNode for MyObj() | test.py:81:11:81:18 | [pre objCreate] ControlFlowNode for MyObj() |
70+
| test.py:81:17:81:17 | [post arg] ControlFlowNode for x | test.py:81:17:81:17 | ControlFlowNode for x |
71+
| test.py:82:9:82:11 | [post read] ControlFlowNode for obj | test.py:82:9:82:11 | ControlFlowNode for obj |
72+
| test.py:87:10:87:39 | [post arg] ControlFlowNode for fields_with_local_flow() | test.py:87:10:87:39 | ControlFlowNode for fields_with_local_flow() |
73+
| test.py:87:33:87:38 | [post arg] ControlFlowNode for SOURCE | test.py:87:33:87:38 | ControlFlowNode for SOURCE |

python/ql/test/experimental/dataflow/fieldflow/test.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,20 @@ def test_example2():
5353
a = NestedObj()
5454

5555
a.obj.foo = x
56-
a.getObj().foo = x
5756

5857
SINK(a.obj.foo)
5958

6059

60+
def test_example2_method():
61+
x = SOURCE
62+
63+
a = NestedObj()
64+
65+
a.getObj().foo = x
66+
67+
SINK(a.obj.foo) # Flow missing
68+
69+
6170
def test_example3():
6271
obj = MyObj(SOURCE)
6372
SINK(obj.foo)

0 commit comments

Comments
 (0)