Skip to content

Commit ef5818e

Browse files
committed
support import * in ApiGraphs
1 parent 16774ba commit ef5818e

File tree

3 files changed

+16
-3
lines changed

3 files changed

+16
-3
lines changed

python/ql/lib/semmle/python/ApiGraphs.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -908,6 +908,13 @@ private predicate exports(Module mod, string prop, DataFlow::Node rhs) {
908908
rhs.asExpr() = assign.getValue() and
909909
exists(Variable v | assign.defines(v) and prop = v.getId())
910910
)
911-
// TODO: Re-exports.
911+
or
912+
// `from foo import *`, just forward directly.
913+
exists(ImportStar star, Module subMod |
914+
star.getEnclosingModule() = mod and
915+
mod.getPackage().getName() + "." + star.getImportedModuleName() = subMod.getName() and
916+
exports(subMod, prop, rhs)
917+
)
918+
// TODO: named imports (somehow)
912919
// TODO: use this predicate with __init__.py?
913920
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
pass
1+
from foo import *

python/ql/test/library-tests/ApiGraphs/py3/mypkg/foo.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,10 @@
33
class MyClass: #$ def=moduleImport("mypkg").getMember("foo").getMember("MyClass")
44
def myFunc(self, x): #$ def=moduleImport("mypkg").getMember("foo").getMember("MyClass").getMember("myFunc") use=moduleImport("mypkg").getMember("foo").getMember("MyClass").getMember("myFunc").getParameter(1)
55
self.selfThing() #$ use=moduleImport("mypkg").getMember("foo").getMember("MyClass").getMember("myFunc").getParameter(0).getMember("selfThing").getReturn()
6-
x.xThing() #$ use=moduleImport("mypkg").getMember("foo").getMember("MyClass").getMember("myFunc").getParameter(1).getMember("xThing").getReturn()
6+
x.xThing() #$ use=moduleImport("mypkg").getMember("foo").getMember("MyClass").getMember("myFunc").getParameter(1).getMember("xThing").getReturn()
7+
8+
value2 = 3 #$ def=moduleImport("mypkg").getMember("foo").getMember("value2")
9+
10+
# this entire file is imported from bar.py
11+
12+
value3 = 3 #$ def=moduleImport("mypkg").getMember("bar").getMember("value3")

0 commit comments

Comments
 (0)