Skip to content

Commit 766e6c4

Browse files
committed
Python: Handle if-then-else definitions in import resolution
1 parent 80f5342 commit 766e6c4

File tree

3 files changed

+15
-5
lines changed

3 files changed

+15
-5
lines changed
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
---
2+
category: minorAnalysis
3+
---
4+
* Fixed module resolution so we properly recognize definitions made within if-then-else statements.

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,19 @@ module ImportResolution {
7171
*/
7272
pragma[nomagic]
7373
predicate module_export(Module m, string name, DataFlow::CfgNode defn) {
74-
exists(EssaVariable v |
74+
exists(EssaVariable v, EssaDefinition essaDef |
7575
v.getName() = name and
76-
v.getAUse() = ImportStar::getStarImported*(m).getANormalExit()
76+
v.getAUse() = ImportStar::getStarImported*(m).getANormalExit() and
77+
(
78+
essaDef = v.getDefinition()
79+
or
80+
// to handle definitions guarded by if-then-else
81+
essaDef = v.getDefinition().(PhiFunction).getAnInput()
82+
)
7783
|
78-
defn.getNode() = v.getDefinition().(AssignmentDefinition).getValue()
84+
defn.getNode() = essaDef.(AssignmentDefinition).getValue()
7985
or
80-
defn.getNode() = v.getDefinition().(ArgumentRefinement).getArgument()
86+
defn.getNode() = essaDef.(ArgumentRefinement).getArgument()
8187
)
8288
or
8389
exists(Alias a |

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ def local_import():
9191

9292
# check that definitions from within if-then-else are found
9393
from if_then_else import if_then_else_defined
94-
check("if_then_else_defined", if_then_else_defined, "if_defined", globals()) #$ MISSING: prints=if_defined prints=else_defined_1 prints=else_defined_2
94+
check("if_then_else_defined", if_then_else_defined, "if_defined", globals()) #$ prints=if_defined prints=else_defined_1 prints=else_defined_2
9595

9696
exit(__file__)
9797

0 commit comments

Comments
 (0)