@@ -34,8 +34,9 @@ module EscapingCaptureFlowSig implements DataFlow::ConfigSig {
34
34
35
35
predicate isSink ( DataFlow:: Node node ) {
36
36
// Stored in a field.
37
- exists ( DataFlow:: AttrWrite aw | aw .getObject ( ) = node )
38
- or
37
+ // This appeared to lead to FPs through wrapper classes.
38
+ // exists(DataFlow::AttrWrite aw | aw.getObject() = node)
39
+ // or
39
40
// Stored in a dict/list.
40
41
exists ( Assign assign , Subscript sub |
41
42
sub = assign .getATarget ( ) and node .asExpr ( ) = assign .getValue ( )
@@ -44,7 +45,7 @@ module EscapingCaptureFlowSig implements DataFlow::ConfigSig {
44
45
// Stored in a list.
45
46
exists ( DataFlow:: MethodCallNode mc | mc .calls ( _, "append" ) and node = mc .getArg ( 0 ) )
46
47
or
47
- // Used in a yeild statement, likely included in a collection.
48
+ // Used in a yield statement, likely included in a collection.
48
49
// The element of comprehension expressions desugar to involve a yield statement internally.
49
50
exists ( Yield y | node .asExpr ( ) = y .getValue ( ) )
50
51
}
@@ -64,6 +65,8 @@ predicate escapingCapture(CallableExpr capturing, Loop loop, Variable var) {
64
65
EscapingCaptureFlow:: flow ( DataFlow:: exprNode ( capturing ) , _)
65
66
}
66
67
67
- from CallableExpr capturing , AstNode loop , Variable var
68
- where escapingCapture ( capturing , loop , var )
69
- select capturing , "Capture of loop variable $@." , loop , var .getId ( )
68
+ from CallableExpr capturing , AstNode loop , Variable var , string descr
69
+ where
70
+ escapingCapture ( capturing , loop , var ) and
71
+ if capturing instanceof Lambda then descr = "lambda" else descr = "function"
72
+ select capturing , "This " + descr + " captures the loop variable $@." , loop , var .getId ( )
0 commit comments