Skip to content

Commit 26286e5

Browse files
authored
Merge pull request #4174 from yoff/SharedDataflow_PointsToImpliesDataflow
Python: Dataflow, Test that `pointsTo` implies data flow merging now, will fix `self` in a later PR
2 parents 1e048d8 + 45317bc commit 26286e5

File tree

5 files changed

+176
-0
lines changed

5 files changed

+176
-0
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
| pointsto_regressions.py:15:18:15:21 | ControlFlowNode for self | pointsto_regressions.py:19:9:19:12 | ControlFlowNode for self |
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
| code/f_finally.py:3:15:3:18 | ControlFlowNode for self | code/f_finally.py:4:9:4:12 | ControlFlowNode for self |
2+
| code/f_finally.py:3:15:3:18 | ControlFlowNode for self | code/f_finally.py:6:13:6:16 | ControlFlowNode for self |
3+
| code/f_finally.py:3:15:3:18 | ControlFlowNode for self | code/f_finally.py:8:21:8:24 | ControlFlowNode for self |
4+
| code/f_finally.py:3:15:3:18 | ControlFlowNode for self | code/f_finally.py:8:21:8:24 | ControlFlowNode for self |
5+
| code/f_finally.py:3:15:3:18 | ControlFlowNode for self | code/f_finally.py:10:17:10:20 | ControlFlowNode for self |
6+
| code/f_finally.py:3:15:3:18 | ControlFlowNode for self | code/f_finally.py:10:17:10:20 | ControlFlowNode for self |
7+
| code/g_class_init.py:5:18:5:21 | ControlFlowNode for self | code/g_class_init.py:6:9:6:12 | ControlFlowNode for self |
8+
| code/g_class_init.py:5:18:5:21 | ControlFlowNode for self | code/g_class_init.py:7:9:7:12 | ControlFlowNode for self |
9+
| code/g_class_init.py:5:18:5:21 | ControlFlowNode for self | code/g_class_init.py:10:9:10:12 | ControlFlowNode for self |
10+
| code/g_class_init.py:5:18:5:21 | ControlFlowNode for self | code/g_class_init.py:11:9:11:12 | ControlFlowNode for self |
11+
| code/g_class_init.py:5:18:5:21 | ControlFlowNode for self | code/g_class_init.py:14:9:14:12 | ControlFlowNode for self |
12+
| code/g_class_init.py:16:16:16:19 | ControlFlowNode for self | code/g_class_init.py:17:13:17:16 | ControlFlowNode for self |
13+
| code/g_class_init.py:16:16:16:19 | ControlFlowNode for self | code/g_class_init.py:18:23:18:26 | ControlFlowNode for self |
14+
| code/g_class_init.py:16:16:16:19 | ControlFlowNode for self | code/g_class_init.py:19:17:19:20 | ControlFlowNode for self |
15+
| code/g_class_init.py:16:16:16:19 | ControlFlowNode for self | code/g_class_init.py:20:13:20:16 | ControlFlowNode for self |
16+
| code/g_class_init.py:34:18:34:21 | ControlFlowNode for self | code/g_class_init.py:35:18:35:21 | ControlFlowNode for self |
17+
| code/g_class_init.py:34:18:34:21 | ControlFlowNode for self | code/g_class_init.py:36:25:36:28 | ControlFlowNode for self |
18+
| code/g_class_init.py:46:18:46:21 | ControlFlowNode for self | code/g_class_init.py:48:13:48:16 | ControlFlowNode for self |
19+
| code/g_class_init.py:46:18:46:21 | ControlFlowNode for self | code/g_class_init.py:50:13:50:16 | ControlFlowNode for self |
20+
| code/g_class_init.py:52:14:52:17 | ControlFlowNode for self | code/g_class_init.py:53:12:53:15 | ControlFlowNode for self |
21+
| code/h_classes.py:3:1:3:16 | ControlFlowNode for ClassExpr | code/h_classes.py:10:1:10:9 | ControlFlowNode for type() |
22+
| code/h_classes.py:3:1:3:16 | ControlFlowNode for ClassExpr | code/h_classes.py:15:5:15:13 | ControlFlowNode for type() |
23+
| code/h_classes.py:7:18:7:21 | ControlFlowNode for self | code/h_classes.py:8:9:8:12 | ControlFlowNode for self |
24+
| code/h_classes.py:25:18:25:21 | ControlFlowNode for self | code/h_classes.py:27:13:27:16 | ControlFlowNode for self |
25+
| code/h_classes.py:25:18:25:21 | ControlFlowNode for self | code/h_classes.py:29:13:29:16 | ControlFlowNode for self |
26+
| code/h_classes.py:25:18:25:21 | ControlFlowNode for self | code/h_classes.py:31:13:31:16 | ControlFlowNode for self |
27+
| code/k_getsetattr.py:6:15:6:18 | ControlFlowNode for self | code/k_getsetattr.py:7:17:7:20 | ControlFlowNode for self |
28+
| code/k_getsetattr.py:6:15:6:18 | ControlFlowNode for self | code/k_getsetattr.py:8:17:8:20 | ControlFlowNode for self |
29+
| code/k_getsetattr.py:6:15:6:18 | ControlFlowNode for self | code/k_getsetattr.py:9:17:9:20 | ControlFlowNode for self |
30+
| code/k_getsetattr.py:6:15:6:18 | ControlFlowNode for self | code/k_getsetattr.py:10:17:10:20 | ControlFlowNode for self |
31+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:7:17:7:20 | ControlFlowNode for self |
32+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:8:17:8:20 | ControlFlowNode for self |
33+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:9:17:9:20 | ControlFlowNode for self |
34+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:10:17:10:20 | ControlFlowNode for self |
35+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:13:17:13:20 | ControlFlowNode for self |
36+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:14:17:14:20 | ControlFlowNode for self |
37+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:15:9:15:12 | ControlFlowNode for self |
38+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:16:17:16:20 | ControlFlowNode for self |
39+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:17:17:17:20 | ControlFlowNode for self |
40+
| code/k_getsetattr.py:12:15:12:18 | ControlFlowNode for self | code/k_getsetattr.py:18:17:18:20 | ControlFlowNode for self |
41+
| code/l_calls.py:3:13:3:14 | ControlFlowNode for List | code/l_calls.py:4:12:4:12 | ControlFlowNode for x |
42+
| code/l_calls.py:6:13:6:14 | ControlFlowNode for List | code/l_calls.py:7:16:7:16 | ControlFlowNode for x |
43+
| code/l_calls.py:12:1:12:20 | ControlFlowNode for ClassExpr | code/l_calls.py:16:16:16:18 | ControlFlowNode for cls |
44+
| code/l_calls.py:12:1:12:20 | ControlFlowNode for ClassExpr | code/l_calls.py:24:13:24:22 | ControlFlowNode for Attribute() |
45+
| code/l_calls.py:12:1:12:20 | ControlFlowNode for ClassExpr | code/l_calls.py:25:16:25:16 | ControlFlowNode for a |
46+
| code/l_calls.py:23:11:23:14 | ControlFlowNode for self | code/l_calls.py:24:13:24:16 | ControlFlowNode for self |
47+
| code/l_calls.py:33:5:33:23 | ControlFlowNode for FunctionExpr | code/l_calls.py:39:1:39:3 | ControlFlowNode for Attribute |
48+
| code/l_calls.py:33:11:33:14 | ControlFlowNode for self | code/l_calls.py:34:9:34:12 | ControlFlowNode for self |
49+
| code/l_calls.py:48:5:48:30 | ControlFlowNode for FunctionExpr | code/l_calls.py:53:1:53:3 | ControlFlowNode for Attribute |
50+
| code/m_attributes.py:5:18:5:21 | ControlFlowNode for self | code/m_attributes.py:6:9:6:12 | ControlFlowNode for self |
51+
| code/m_attributes.py:8:13:8:16 | ControlFlowNode for self | code/m_attributes.py:9:9:9:12 | ControlFlowNode for self |
52+
| code/q_super.py:3:18:3:21 | ControlFlowNode for self | code/q_super.py:4:22:4:25 | ControlFlowNode for self |
53+
| code/q_super.py:10:18:10:21 | ControlFlowNode for self | code/q_super.py:4:22:4:25 | ControlFlowNode for self |
54+
| code/q_super.py:10:18:10:21 | ControlFlowNode for self | code/q_super.py:11:22:11:25 | ControlFlowNode for self |
55+
| code/q_super.py:10:18:10:21 | ControlFlowNode for self | code/q_super.py:12:32:12:35 | ControlFlowNode for self |
56+
| code/q_super.py:21:14:21:17 | ControlFlowNode for self | code/q_super.py:22:32:22:35 | ControlFlowNode for self |
57+
| code/q_super.py:26:14:26:17 | ControlFlowNode for self | code/q_super.py:22:32:22:35 | ControlFlowNode for self |
58+
| code/q_super.py:26:14:26:17 | ControlFlowNode for self | code/q_super.py:27:32:27:35 | ControlFlowNode for self |
59+
| code/q_super.py:31:14:31:17 | ControlFlowNode for self | code/q_super.py:22:32:22:35 | ControlFlowNode for self |
60+
| code/q_super.py:31:14:31:17 | ControlFlowNode for self | code/q_super.py:32:32:32:35 | ControlFlowNode for self |
61+
| code/q_super.py:37:14:37:17 | ControlFlowNode for self | code/q_super.py:22:32:22:35 | ControlFlowNode for self |
62+
| code/q_super.py:37:14:37:17 | ControlFlowNode for self | code/q_super.py:27:32:27:35 | ControlFlowNode for self |
63+
| code/q_super.py:37:14:37:17 | ControlFlowNode for self | code/q_super.py:38:32:38:35 | ControlFlowNode for self |
64+
| code/q_super.py:48:5:48:17 | ControlFlowNode for ClassExpr | code/q_super.py:51:25:51:29 | ControlFlowNode for Attribute |
65+
| code/q_super.py:50:22:50:25 | ControlFlowNode for self | code/q_super.py:51:32:51:35 | ControlFlowNode for self |
66+
| code/q_super.py:57:18:57:21 | ControlFlowNode for self | code/q_super.py:58:25:58:28 | ControlFlowNode for self |
67+
| code/q_super.py:63:5:63:17 | ControlFlowNode for ClassExpr | code/q_super.py:66:19:66:23 | ControlFlowNode for Attribute |
68+
| code/q_super.py:65:22:65:25 | ControlFlowNode for self | code/q_super.py:66:26:66:29 | ControlFlowNode for self |
69+
| code/q_super.py:73:18:73:21 | ControlFlowNode for self | code/q_super.py:74:22:74:25 | ControlFlowNode for self |
70+
| code/r_regressions.py:7:18:7:21 | ControlFlowNode for self | code/r_regressions.py:9:9:9:12 | ControlFlowNode for self |
71+
| code/r_regressions.py:7:18:7:21 | ControlFlowNode for self | code/r_regressions.py:12:9:12:12 | ControlFlowNode for self |
72+
| code/r_regressions.py:7:18:7:21 | ControlFlowNode for self | code/r_regressions.py:13:9:13:12 | ControlFlowNode for self |
73+
| code/r_regressions.py:15:15:15:18 | ControlFlowNode for self | code/r_regressions.py:16:9:16:12 | ControlFlowNode for self |
74+
| code/r_regressions.py:15:15:15:18 | ControlFlowNode for self | code/r_regressions.py:18:13:18:16 | ControlFlowNode for self |
75+
| code/r_regressions.py:15:15:15:18 | ControlFlowNode for self | code/r_regressions.py:20:21:20:24 | ControlFlowNode for self |
76+
| code/r_regressions.py:15:15:15:18 | ControlFlowNode for self | code/r_regressions.py:20:21:20:24 | ControlFlowNode for self |
77+
| code/r_regressions.py:15:15:15:18 | ControlFlowNode for self | code/r_regressions.py:22:17:22:20 | ControlFlowNode for self |
78+
| code/r_regressions.py:15:15:15:18 | ControlFlowNode for self | code/r_regressions.py:22:17:22:20 | ControlFlowNode for self |
79+
| code/r_regressions.py:46:1:46:14 | ControlFlowNode for FunctionExpr | code/r_regressions.py:52:9:52:12 | ControlFlowNode for fail |
80+
| code/r_regressions.py:86:1:86:24 | ControlFlowNode for ClassExpr | code/r_regressions.py:85:2:85:33 | ControlFlowNode for method_decorator()() |
81+
| code/r_regressions.py:86:1:86:24 | ControlFlowNode for ClassExpr | code/r_regressions.py:90:1:90:9 | ControlFlowNode for TestFirst |
82+
| code/t_type.py:3:1:3:16 | ControlFlowNode for ClassExpr | code/t_type.py:6:1:6:9 | ControlFlowNode for type() |
83+
| code/t_type.py:3:1:3:16 | ControlFlowNode for ClassExpr | code/t_type.py:13:5:13:13 | ControlFlowNode for type() |
84+
| code/test_package/module2.py:5:5:5:6 | ControlFlowNode for Dict | code/j_convoluted_imports.py:25:1:25:1 | ControlFlowNode for r |
85+
| code/v_pointsto_regressions.py:15:18:15:21 | ControlFlowNode for self | code/v_pointsto_regressions.py:19:9:19:12 | ControlFlowNode for self |
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/**
2+
* Test that the new data-flow analysis can connect any two
3+
* data-flow nodes that the points-to analysis can.
4+
*/
5+
6+
private import python
7+
import semmle.python.dataflow.new.DataFlow
8+
9+
predicate pointsToOrigin(DataFlow::CfgNode pointer, DataFlow::CfgNode origin) {
10+
origin.getNode() = pointer.getNode().pointsTo().getOrigin()
11+
}
12+
13+
class PointsToConfiguration extends DataFlow::Configuration {
14+
PointsToConfiguration() { this = "PointsToConfiguration" }
15+
16+
override predicate isSource(DataFlow::Node node) { pointsToOrigin(_, node) }
17+
18+
override predicate isSink(DataFlow::Node node) { pointsToOrigin(node, _) }
19+
}
20+
21+
predicate hasFlow(DataFlow::Node origin, DataFlow::Node pointer) {
22+
exists(PointsToConfiguration config, DataFlow::PathNode source, DataFlow::PathNode sink |
23+
source.getNode() = origin and
24+
sink.getNode() = pointer and
25+
config.hasFlowPath(source, sink)
26+
)
27+
}
28+
29+
from DataFlow::Node pointer, DataFlow::Node origin
30+
where
31+
exists(pointer.getLocation().getFile().getRelativePath()) and
32+
exists(origin.getLocation().getFile().getRelativePath()) and
33+
pointsToOrigin(pointer, origin) and
34+
not hasFlow(origin, pointer)
35+
select origin, pointer
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# This file contains snippets from snapshots that displayed interesting results for `ImpliesDataflow.ql`.
2+
3+
class Chatbot:
4+
"""
5+
Main class which launch the training or testing mode
6+
"""
7+
8+
class TestMode:
9+
""" Simple structure representing the different testing modes
10+
"""
11+
ALL = 'all'
12+
INTERACTIVE = 'interactive' # The user can write his own questions
13+
DAEMON = 'daemon' # The chatbot runs on background and can regularly be called to predict something
14+
15+
def __init__(self):
16+
"""
17+
"""
18+
# Model/dataset parameters
19+
self.args = None
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
def test_conditoinal_function(cond):
2+
def foo():
3+
return "foo"
4+
5+
def bar():
6+
return "bar"
7+
8+
if cond:
9+
f = foo
10+
else:
11+
f = bar
12+
13+
sink = f()
14+
return sink
15+
16+
17+
f_false = test_conditoinal_function(False)
18+
f_true = test_conditoinal_function(True)
19+
20+
21+
def test_redefinition():
22+
def foo():
23+
return "foo"
24+
25+
f = foo
26+
27+
def foo():
28+
return "foo redefined"
29+
30+
sink_foo = f()
31+
sink_redefined = foo()
32+
return sink_foo, sink_redefined
33+
34+
foo, redefined = test_redefinition()
35+
assert foo == "foo"
36+
assert redefined == "foo redefined"

0 commit comments

Comments
 (0)