Skip to content

Commit

Permalink
Merge pull request github#17653 from yoff/python/typetracking-through…
Browse files Browse the repository at this point in the history
…-comprehensions
  • Loading branch information
yoff authored Oct 8, 2024
2 parents 3c1a19c + 6d486f9 commit 1f1b1b7
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
---
category: minorAnalysis
---
* Type tracking, and hence the API graph, is now able to correctly trace trough comprehensions.
7 changes: 7 additions & 0 deletions python/ql/lib/semmle/python/ApiGraphs.qll
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,13 @@ module API {
ref = pred.getSubscript(_) and
ref.asCfgNode().isLoad()
or
// Subscript via comprehension
lbl = Label::subscript() and
exists(PY::Comp comp |
pred.asExpr() = comp.getIterable() and
ref.asExpr() = comp.getNthInnerLoop(0).getTarget()
)
or
// Subclassing a node
lbl = Label::subclass() and
exists(PY::ClassExpr clsExpr, DataFlow::Node superclass | pred.flowsTo(superclass) |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ module TypeTrackingInput implements Shared::TypeTrackingInput {
var.hasDefiningNode(def)
|
nodeTo.(DataFlowPublic::ScopeEntryDefinitionNode).getDefinition() = e and
nodeFrom.asCfgNode() = def.getValue() and
nodeFrom.asCfgNode() = def and
var.getScope().getScope*() = nodeFrom.getScope()
)
}
Expand Down
4 changes: 2 additions & 2 deletions python/ql/test/library-tests/frameworks/stdlib/http_server.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ def test_cgi_FieldStorage_taint():
form['key'][0].value, # $ tainted
form['key'][0].file, # $ tainted
form['key'][0].filename, # $ tainted
[field.value for field in form['key']], # $ MISSING: tainted
[field.value for field in form['key']], # $ tainted

# `form.getvalue('key')` will be a list, if multiple fields named "key" are provided
form.getvalue('key'), # $ tainted
Expand All @@ -40,7 +40,7 @@ def test_cgi_FieldStorage_taint():

form.getlist('key'), # $ tainted
form.getlist('key')[0], # $ tainted
[field.value for field in form.getlist('key')], # $ MISSING: tainted
[field.value for field in form.getlist('key')], # $ tainted
)


Expand Down

0 comments on commit 1f1b1b7

Please sign in to comment.