Skip to content

Commit 4df7dfb

Browse files
committed
Python: Don't import module as module_attr
For `from <pkg> import <attr>` we would use to treat the `<pkg>` (ImportExpr) as a definition of the name `<attr>`. Since this removes bad import-flow, and nothing broke, I'm guessing this was never intentional.
1 parent 6ba39d5 commit 4df7dfb

File tree

3 files changed

+2
-15
lines changed

3 files changed

+2
-15
lines changed

python/ql/lib/semmle/python/dataflow/new/internal/ImportResolution.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ module ImportResolution {
9595
)
9696
or
9797
exists(Alias a |
98-
defn.asExpr() = [a.getValue(), a.getValue().(ImportMember).getModule()] and
98+
defn.asExpr() = a.getValue() and
9999
a.getAsname().(Name).getId() = name and
100100
defn.getScope() = m
101101
)

python/ql/test/experimental/import-resolution/ModuleExport.expected

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -114,39 +114,30 @@
114114
| main | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral |
115115
| main | _print | trace.py:5:10:5:14 | ControlFlowNode for print |
116116
| main | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral |
117-
| main | aliased_subpackage | main.py:54:6:54:12 | ControlFlowNode for ImportExpr |
118117
| main | aliased_subpackage | main.py:54:21:54:52 | ControlFlowNode for ImportMember |
119118
| main | aliased_subpackage | main.py:65:8:65:25 | ControlFlowNode for ImportExpr |
120-
| main | bar_attr | main.py:42:6:42:8 | ControlFlowNode for ImportExpr |
121119
| main | bar_attr | main.py:42:17:42:24 | ControlFlowNode for ImportMember |
122120
| main | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr |
123-
| main | clashing_attr | main.py:83:6:83:15 | ControlFlowNode for ImportExpr |
124121
| main | clashing_attr | main.py:83:24:83:36 | ControlFlowNode for ImportMember |
125122
| main | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr |
126123
| main | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr |
127124
| main | foo | main.py:27:8:27:10 | ControlFlowNode for ImportExpr |
128125
| main | foo_alias | main.py:34:8:34:10 | ControlFlowNode for ImportExpr |
129-
| main | if_then_else_defined | main.py:93:6:93:17 | ControlFlowNode for ImportExpr |
130126
| main | if_then_else_defined | main.py:93:26:93:45 | ControlFlowNode for ImportMember |
131127
| main | if_then_else_refined | main.py:100:8:100:27 | ControlFlowNode for ImportExpr |
132128
| main | local_import | main.py:57:1:57:19 | ControlFlowNode for FunctionExpr |
133-
| main | namespace_module_attr | main.py:79:10:79:43 | ControlFlowNode for ImportExpr |
134129
| main | namespace_module_attr | main.py:79:52:79:72 | ControlFlowNode for ImportMember |
135-
| main | non_clashing_submodule | main.py:83:6:83:15 | ControlFlowNode for ImportExpr |
136130
| main | non_clashing_submodule | main.py:83:39:83:60 | ControlFlowNode for ImportMember |
137131
| main | package | main.py:69:8:69:25 | ControlFlowNode for ImportExpr |
138132
| main | package | main.py:73:8:73:35 | ControlFlowNode for ImportExpr |
139-
| main | package_attr_alias | main.py:50:6:50:12 | ControlFlowNode for ImportExpr |
140133
| main | package_attr_alias | main.py:50:21:50:54 | ControlFlowNode for ImportMember |
141134
| main | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr |
142-
| main | print_function | main.py:21:6:21:15 | ControlFlowNode for ImportExpr |
143135
| main | print_function | main.py:21:24:21:37 | ControlFlowNode for ImportMember |
144136
| main | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember |
145137
| main | refined | main.py:97:8:97:14 | ControlFlowNode for ImportExpr |
146138
| main | simplistic_reexport | main.py:103:8:103:26 | ControlFlowNode for ImportExpr |
147139
| main | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr |
148140
| main | subpackage2_attr | package/subpackage2/__init__.py:4:20:4:37 | ControlFlowNode for Str |
149-
| main | subpackage_attr | main.py:46:6:46:23 | ControlFlowNode for ImportExpr |
150141
| main | subpackage_attr | main.py:46:32:46:46 | ControlFlowNode for ImportMember |
151142
| main | sys | main.py:22:8:22:10 | ControlFlowNode for ImportExpr |
152143
| namespace_package.namespace_module | __all__ | trace.py:52:11:52:46 | ControlFlowNode for List |
@@ -198,9 +189,7 @@
198189
| package.subpackage.__init__ | check | trace.py:26:1:26:61 | ControlFlowNode for FunctionExpr |
199190
| package.subpackage.__init__ | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr |
200191
| package.subpackage.__init__ | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr |
201-
| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:6:7:7 | ControlFlowNode for ImportExpr |
202192
| package.subpackage.__init__ | imported_attr | package/subpackage/__init__.py:7:16:7:55 | ControlFlowNode for ImportMember |
203-
| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:6:11:15 | ControlFlowNode for ImportExpr |
204193
| package.subpackage.__init__ | irrelevant_attr | package/subpackage/__init__.py:11:24:11:38 | ControlFlowNode for ImportMember |
205194
| package.subpackage.__init__ | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr |
206195
| package.subpackage.__init__ | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember |
@@ -241,7 +230,6 @@
241230
| simplistic_reexport | _indent_level | trace.py:3:17:3:17 | ControlFlowNode for IntegerLiteral |
242231
| simplistic_reexport | _print | trace.py:5:10:5:14 | ControlFlowNode for print |
243232
| simplistic_reexport | _status | trace.py:21:11:21:11 | ControlFlowNode for IntegerLiteral |
244-
| simplistic_reexport | bar_attr | simplistic_reexport.py:6:6:6:8 | ControlFlowNode for ImportExpr |
245233
| simplistic_reexport | bar_attr | simplistic_reexport.py:6:17:6:24 | ControlFlowNode for ImportMember |
246234
| simplistic_reexport | bar_attr | simplistic_reexport.py:9:12:9:24 | ControlFlowNode for Str |
247235
| simplistic_reexport | baz_attr | baz.py:4:12:4:21 | ControlFlowNode for Str |
@@ -260,6 +248,5 @@
260248
| trace | enter | trace.py:11:1:11:21 | ControlFlowNode for FunctionExpr |
261249
| trace | exit | trace.py:16:1:16:20 | ControlFlowNode for FunctionExpr |
262250
| trace | print | trace.py:7:1:7:27 | ControlFlowNode for FunctionExpr |
263-
| trace | print_function | trace.py:1:6:1:15 | ControlFlowNode for ImportExpr |
264251
| trace | print_function | trace.py:1:24:1:37 | ControlFlowNode for ImportMember |
265252
| trace | status | trace.py:23:1:23:13 | ControlFlowNode for FunctionExpr |

python/ql/test/experimental/import-resolution/main.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ def local_import():
101101
check("if_then_else_refined.src", if_then_else_refined.src, if_then_else_refined.src, globals()) #$ prints=SOURCE
102102

103103
import simplistic_reexport # $ imports=simplistic_reexport as=simplistic_reexport
104-
check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints="<module bar>" prints=bar_attr
104+
check("simplistic_reexport.bar_attr", simplistic_reexport.bar_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=bar_attr
105105
check("simplistic_reexport.baz_attr", simplistic_reexport.baz_attr, "overwritten", globals()) #$ prints=overwritten SPURIOUS: prints=baz_attr
106106

107107
exit(__file__)

0 commit comments

Comments
 (0)