Skip to content

Commit 7eddf56

Browse files
committed
Python: Fix bad join in OutgoingRequestCall
On `keras-team/keras`, this was producing ~200 million intermediate tuples in order to produce a total of ... 2 tuples. After the refactor, max intermediate tuple count is ~80k for the charpred (and 4 for the new helper predicate).
1 parent b1aefb9 commit 7eddf56

File tree

1 file changed

+13
-9
lines changed

1 file changed

+13
-9
lines changed

python/ql/lib/semmle/python/frameworks/Requests.qll

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,18 @@ private import semmle.python.frameworks.data.ModelsAsData
2424
* - https://requests.readthedocs.io/en/latest/
2525
*/
2626
module Requests {
27+
/** Join-order helper for `OutgoingRequestCall`. */
28+
pragma[nomagic]
29+
private API::Node sessionInstance() {
30+
exists(API::Node moduleExporting |
31+
moduleExporting in [
32+
API::moduleImport("requests"), //
33+
API::moduleImport("requests").getMember("sessions")
34+
] and
35+
result = moduleExporting.getMember(["Session", "session"]).getReturn()
36+
)
37+
}
38+
2739
/**
2840
* An outgoing HTTP request, from the `requests` library.
2941
*
@@ -37,15 +49,7 @@ module Requests {
3749
(
3850
this = API::moduleImport("requests").getMember(methodName).getACall()
3951
or
40-
exists(API::Node moduleExporting, API::Node sessionInstance |
41-
moduleExporting in [
42-
API::moduleImport("requests"), //
43-
API::moduleImport("requests").getMember("sessions")
44-
] and
45-
sessionInstance = moduleExporting.getMember(["Session", "session"]).getReturn()
46-
|
47-
this = sessionInstance.getMember(methodName).getACall()
48-
)
52+
this = sessionInstance().getMember(methodName).getACall()
4953
)
5054
}
5155

0 commit comments

Comments
 (0)