Skip to content

Commit 5646af5

Browse files
committed
Python: Fix too many results from DataFlow::importNode
1 parent 0d42e54 commit 5646af5

File tree

3 files changed

+8
-6
lines changed

3 files changed

+8
-6
lines changed

python/ql/src/semmle/python/dataflow/new/internal/DataFlowUtil.qll

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,11 @@ Node importNode(string name) {
6868
// Because named imports are modelled as `AttrRead`s, the statement `from foo import bar as baz`
6969
// is interpreted as if it was an assignment `baz = foo.bar`, which means `baz` gets tracked as a
7070
// reference to `foo.bar`, as desired.
71-
result.asCfgNode().getNode() = any(ImportExpr i | i.getName() = name)
71+
exists(ImportExpr imp_expr |
72+
imp_expr.getName() = name and
73+
result.asCfgNode().getNode() = imp_expr and
74+
// in `import foo.bar` we DON'T want to give a result for `importNode("foo.bar")`,
75+
// only for `importNode("foo")`. We exclude those cases with the following clause.
76+
not exists(Import imp | imp.getAName().getValue() = imp_expr)
77+
)
7278
}

python/ql/test/experimental/dataflow/import-helper/ImportHelper.expected

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,17 @@
44
| test2.py:1:19:1:21 | ControlFlowNode for ImportMember | mypkg.foo |
55
| test2.py:1:24:1:26 | ControlFlowNode for ImportMember | mypkg.bar |
66
| test3.py:1:8:1:16 | ControlFlowNode for ImportExpr | mypkg |
7-
| test3.py:1:8:1:16 | ControlFlowNode for ImportExpr | mypkg.foo |
87
| test3.py:2:8:2:16 | ControlFlowNode for ImportExpr | mypkg |
9-
| test3.py:2:8:2:16 | ControlFlowNode for ImportExpr | mypkg.bar |
108
| test4.py:1:8:1:16 | ControlFlowNode for ImportExpr | mypkg.foo |
119
| test4.py:2:8:2:16 | ControlFlowNode for ImportExpr | mypkg.bar |
1210
| test5.py:1:8:1:12 | ControlFlowNode for ImportExpr | mypkg |
1311
| test5.py:9:6:9:10 | ControlFlowNode for ImportExpr | mypkg |
1412
| test5.py:9:19:9:29 | ControlFlowNode for ImportMember | mypkg.bar |
1513
| test6.py:1:8:1:12 | ControlFlowNode for ImportExpr | mypkg |
1614
| test6.py:5:8:5:16 | ControlFlowNode for ImportExpr | mypkg |
17-
| test6.py:5:8:5:16 | ControlFlowNode for ImportExpr | mypkg.foo |
1815
| test7.py:1:6:1:10 | ControlFlowNode for ImportExpr | mypkg |
1916
| test7.py:1:19:1:21 | ControlFlowNode for ImportMember | mypkg.foo |
2017
| test7.py:5:8:5:16 | ControlFlowNode for ImportExpr | mypkg |
21-
| test7.py:5:8:5:16 | ControlFlowNode for ImportExpr | mypkg.foo |
2218
| test7.py:9:6:9:10 | ControlFlowNode for ImportExpr | mypkg |
2319
| test7.py:9:19:9:21 | ControlFlowNode for ImportMember | mypkg.foo |
2420
| test_deep.py:1:6:1:21 | ControlFlowNode for ImportExpr | start.middle.end |

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ def track_self(self): # $ tracked_self
108108

109109
def test_long_import_chain():
110110
import foo.bar
111-
foo.baz # $ SPURIOUS: tracked_foo_bar_baz
111+
foo.baz
112112
x = foo.bar.baz # $ tracked_foo_bar_baz
113113
do_stuff(x) # $ tracked_foo_bar_baz
114114

0 commit comments

Comments
 (0)