Skip to content

Commit 17155b6

Browse files
authored
Merge pull request #4514 from tausbn/python-add-module-boundary-flow-steps
Python: Add module boundary flow steps
2 parents d2282fc + a21c295 commit 17155b6

File tree

14 files changed

+75
-5
lines changed

14 files changed

+75
-5
lines changed

python/ql/src/experimental/dataflow/internal/DataFlowPrivate.qll

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,29 @@ predicate jumpStep(Node nodeFrom, Node nodeTo) {
798798
or
799799
// Module variable write
800800
nodeFrom = nodeTo.(ModuleVariableNode).getAWrite()
801+
or
802+
// Read of module attribute:
803+
exists(AttrRead r, ModuleValue mv |
804+
r.getObject().asCfgNode().pointsTo(mv) and
805+
module_export(mv.getScope(), r.getAttributeName(), nodeFrom) and
806+
nodeTo = r
807+
)
808+
}
809+
810+
/**
811+
* Holds if the module `m` defines a name `name` by assigning `defn` to it. This is an
812+
* overapproximation, as `name` may not in fact be exported (e.g. by defining an `__all__` that does
813+
* not include `name`).
814+
*/
815+
private predicate module_export(Module m, string name, CfgNode defn) {
816+
exists(EssaVariable v |
817+
v.getName() = name and
818+
v.getAUse() = m.getANormalExit()
819+
|
820+
defn.getNode() = v.getDefinition().(AssignmentDefinition).getValue()
821+
or
822+
defn.getNode() = v.getDefinition().(ArgumentRefinement).getArgument()
823+
)
801824
}
802825

803826
//--------
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pass
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
bar = "bar"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
foo = "foo"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from .moduleY import spam
2+
from .moduleY import spam as ham
3+
from . import moduleY
4+
from ..subpackage1 import moduleY
5+
from ..subpackage2.moduleZ import eggs
6+
from ..moduleA import foo
7+
8+
try:
9+
from ...package import bar
10+
except Exception as e:
11+
print(e)
12+
13+
try:
14+
from ...sys import path
15+
except Exception as e:
16+
print(e)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from .moduleY import spam
2+
from .moduleY import spam as ham
3+
from . import moduleY
4+
from ..subpackage1 import moduleY
5+
from ..subpackage2.moduleZ import eggs
6+
from ..moduleA import foo
7+
8+
try:
9+
from ...package import bar
10+
except Exception as e:
11+
print(e)
12+
13+
try:
14+
from ...sys import path
15+
except Exception as e:
16+
print(e)
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
spam = "spam"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pass
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
eggs = "eggs"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
import package.subpackage1.moduleX

0 commit comments

Comments
 (0)