Skip to content

Commit 366c574

Browse files
committed
Python: Move import logic into its own module
1 parent 623ad6b commit 366c574

File tree

3 files changed

+39
-21
lines changed

3 files changed

+39
-21
lines changed

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

Lines changed: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ private import python
22
private import DataFlowPublic
33
private import semmle.python.essa.SsaCompute
44
private import semmle.python.dataflow.new.internal.ImportStar
5+
private import semmle.python.dataflow.new.internal.ImportResolution
56
// Since we allow extra data-flow steps from modeled frameworks, we import these
67
// up-front, to ensure these are included. This provides a more seamless experience from
78
// a user point of view, since they don't need to know they need to import a specific
@@ -419,9 +420,9 @@ predicate jumpStepSharedWithTypeTracker(Node nodeFrom, Node nodeTo) {
419420
runtimeJumpStep(nodeFrom, nodeTo)
420421
or
421422
// Read of module attribute:
422-
exists(AttrRead r, ModuleValue mv |
423-
r.getObject().asCfgNode().pointsTo(mv) and
424-
module_export(mv.getScope(), r.getAttributeName(), nodeFrom) and
423+
exists(AttrRead r |
424+
ImportResolution::module_export(ImportResolution::getModule(r.getObject()),
425+
r.getAttributeName(), nodeFrom) and
425426
nodeTo = r
426427
)
427428
or
@@ -445,22 +446,6 @@ predicate jumpStepNotSharedWithTypeTracker(Node nodeFrom, Node nodeTo) {
445446
any(Orm::AdditionalOrmSteps es).jumpStep(nodeFrom, nodeTo)
446447
}
447448

448-
/**
449-
* Holds if the module `m` defines a name `name` by assigning `defn` to it. This is an
450-
* overapproximation, as `name` may not in fact be exported (e.g. by defining an `__all__` that does
451-
* not include `name`).
452-
*/
453-
private predicate module_export(Module m, string name, CfgNode defn) {
454-
exists(EssaVariable v |
455-
v.getName() = name and
456-
v.getAUse() = ImportStar::getStarImported*(m).getANormalExit()
457-
|
458-
defn.getNode() = v.getDefinition().(AssignmentDefinition).getValue()
459-
or
460-
defn.getNode() = v.getDefinition().(ArgumentRefinement).getArgument()
461-
)
462-
}
463-
464449
//--------
465450
// Field flow
466451
//--------
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
private import python
2+
private import semmle.python.dataflow.new.DataFlow
3+
private import semmle.python.dataflow.new.internal.ImportStar
4+
private import semmle.python.dataflow.new.TypeTracker
5+
6+
module ImportResolution {
7+
/**
8+
* Holds if the module `m` defines a name `name` by assigning `defn` to it. This is an
9+
* overapproximation, as `name` may not in fact be exported (e.g. by defining an `__all__` that does
10+
* not include `name`).
11+
*/
12+
predicate module_export(Module m, string name, DataFlow::CfgNode defn) {
13+
exists(EssaVariable v |
14+
v.getName() = name and
15+
v.getAUse() = ImportStar::getStarImported*(m).getANormalExit()
16+
|
17+
defn.getNode() = v.getDefinition().(AssignmentDefinition).getValue()
18+
or
19+
defn.getNode() = v.getDefinition().(ArgumentRefinement).getArgument()
20+
)
21+
}
22+
23+
Module getModule(DataFlow::CfgNode node) {
24+
exists(ModuleValue mv |
25+
node.getNode().pointsTo(mv) and
26+
result = mv.getScope()
27+
)
28+
}
29+
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
private import python
44
private import semmle.python.dataflow.new.internal.Builtins
5+
private import semmle.python.dataflow.new.internal.ImportResolution
6+
private import semmle.python.dataflow.new.DataFlow
57

68
cached
79
module ImportStar {
@@ -71,8 +73,10 @@ module ImportStar {
7173
*/
7274
cached
7375
Module getStarImported(Module m) {
74-
exists(ImportStar i |
75-
i.getScope() = m and result = i.getModule().pointsTo().(ModuleValue).getScope()
76+
exists(ImportStar i, DataFlow::CfgNode imported_module |
77+
imported_module.getNode().getNode() = i.getModule() and
78+
i.getScope() = m and
79+
result = ImportResolution::getModule(imported_module)
7680
)
7781
}
7882

0 commit comments

Comments
 (0)