Skip to content

Commit f221894

Browse files
authored
Merge pull request #9214 from hvitved/dataflow/lambda-fp-flow
Data flow: Do not discard call context when computing reverse lambda flow through jumps
2 parents 5119de8 + f83deb6 commit f221894

File tree

8 files changed

+27
-18
lines changed

8 files changed

+27
-18
lines changed

cpp/ql/lib/semmle/code/cpp/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,9 @@ private module LambdaFlow {
216216
or
217217
// jump step
218218
exists(Node mid, DataFlowType t0 |
219-
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and
219+
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and
220220
toReturn = false and
221-
toJump = true and
222-
lastCall = TDataFlowCallNone()
221+
toJump = true
223222
|
224223
jumpStepCached(node, mid) and
225224
t = t0

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,9 @@ private module LambdaFlow {
216216
or
217217
// jump step
218218
exists(Node mid, DataFlowType t0 |
219-
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and
219+
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and
220220
toReturn = false and
221-
toJump = true and
222-
lastCall = TDataFlowCallNone()
221+
toJump = true
223222
|
224223
jumpStepCached(node, mid) and
225224
t = t0

csharp/ql/lib/semmle/code/csharp/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,9 @@ private module LambdaFlow {
216216
or
217217
// jump step
218218
exists(Node mid, DataFlowType t0 |
219-
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and
219+
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and
220220
toReturn = false and
221-
toJump = true and
222-
lastCall = TDataFlowCallNone()
221+
toJump = true
223222
|
224223
jumpStepCached(node, mid) and
225224
t = t0

java/ql/lib/semmle/code/java/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,9 @@ private module LambdaFlow {
216216
or
217217
// jump step
218218
exists(Node mid, DataFlowType t0 |
219-
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and
219+
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and
220220
toReturn = false and
221-
toJump = true and
222-
lastCall = TDataFlowCallNone()
221+
toJump = true
223222
|
224223
jumpStepCached(node, mid) and
225224
t = t0

python/ql/lib/semmle/python/dataflow/new/internal/DataFlowImplCommon.qll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,9 @@ private module LambdaFlow {
216216
or
217217
// jump step
218218
exists(Node mid, DataFlowType t0 |
219-
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and
219+
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and
220220
toReturn = false and
221-
toJump = true and
222-
lastCall = TDataFlowCallNone()
221+
toJump = true
223222
|
224223
jumpStepCached(node, mid) and
225224
t = t0

ruby/ql/lib/codeql/ruby/dataflow/internal/DataFlowImplCommon.qll

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -216,10 +216,9 @@ private module LambdaFlow {
216216
or
217217
// jump step
218218
exists(Node mid, DataFlowType t0 |
219-
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, _) and
219+
revLambdaFlow(lambdaCall, kind, mid, t0, _, _, lastCall) and
220220
toReturn = false and
221-
toJump = true and
222-
lastCall = TDataFlowCallNone()
221+
toJump = true
223222
|
224223
jumpStepCached(node, mid) and
225224
t = t0

ruby/ql/test/library-tests/dataflow/call-sensitivity/call-sensitivity.expected

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@ edges
55
| call_sensitivity.rb:15:20:15:20 | x : | call_sensitivity.rb:15:28:15:28 | x |
66
| call_sensitivity.rb:17:27:17:27 | x : | call_sensitivity.rb:18:17:18:17 | x : |
77
| call_sensitivity.rb:17:27:17:27 | x : | call_sensitivity.rb:18:17:18:17 | x : |
8+
| call_sensitivity.rb:17:27:17:27 | x : | call_sensitivity.rb:18:17:18:17 | x : |
89
| call_sensitivity.rb:18:17:18:17 | x : | call_sensitivity.rb:27:17:27:17 | x : |
910
| call_sensitivity.rb:18:17:18:17 | x : | call_sensitivity.rb:36:23:36:23 | x : |
11+
| call_sensitivity.rb:18:17:18:17 | x : | call_sensitivity.rb:39:24:39:24 | x : |
1012
| call_sensitivity.rb:27:17:27:17 | x : | call_sensitivity.rb:27:27:27:27 | x |
1113
| call_sensitivity.rb:28:25:28:31 | "taint" : | call_sensitivity.rb:17:27:17:27 | x : |
1214
| call_sensitivity.rb:36:23:36:23 | x : | call_sensitivity.rb:36:31:36:31 | x |
1315
| call_sensitivity.rb:37:25:37:31 | "taint" : | call_sensitivity.rb:17:27:17:27 | x : |
16+
| call_sensitivity.rb:39:24:39:24 | x : | call_sensitivity.rb:39:32:39:32 | x |
17+
| call_sensitivity.rb:40:26:40:32 | "taint" : | call_sensitivity.rb:17:27:17:27 | x : |
1418
nodes
1519
| call_sensitivity.rb:5:6:5:12 | "taint" | semmle.label | "taint" |
1620
| call_sensitivity.rb:7:13:7:13 | x : | semmle.label | x : |
@@ -20,6 +24,8 @@ nodes
2024
| call_sensitivity.rb:15:28:15:28 | x | semmle.label | x |
2125
| call_sensitivity.rb:17:27:17:27 | x : | semmle.label | x : |
2226
| call_sensitivity.rb:17:27:17:27 | x : | semmle.label | x : |
27+
| call_sensitivity.rb:17:27:17:27 | x : | semmle.label | x : |
28+
| call_sensitivity.rb:18:17:18:17 | x : | semmle.label | x : |
2329
| call_sensitivity.rb:18:17:18:17 | x : | semmle.label | x : |
2430
| call_sensitivity.rb:18:17:18:17 | x : | semmle.label | x : |
2531
| call_sensitivity.rb:27:17:27:17 | x : | semmle.label | x : |
@@ -28,9 +34,13 @@ nodes
2834
| call_sensitivity.rb:36:23:36:23 | x : | semmle.label | x : |
2935
| call_sensitivity.rb:36:31:36:31 | x | semmle.label | x |
3036
| call_sensitivity.rb:37:25:37:31 | "taint" : | semmle.label | "taint" : |
37+
| call_sensitivity.rb:39:24:39:24 | x : | semmle.label | x : |
38+
| call_sensitivity.rb:39:32:39:32 | x | semmle.label | x |
39+
| call_sensitivity.rb:40:26:40:32 | "taint" : | semmle.label | "taint" : |
3140
subpaths
3241
#select
3342
| call_sensitivity.rb:5:6:5:12 | "taint" | call_sensitivity.rb:5:6:5:12 | "taint" | call_sensitivity.rb:5:6:5:12 | "taint" | $@ | call_sensitivity.rb:5:6:5:12 | "taint" | "taint" |
3443
| call_sensitivity.rb:15:28:15:28 | x | call_sensitivity.rb:15:9:15:15 | "taint" : | call_sensitivity.rb:15:28:15:28 | x | $@ | call_sensitivity.rb:15:9:15:15 | "taint" : | "taint" : |
3544
| call_sensitivity.rb:27:27:27:27 | x | call_sensitivity.rb:28:25:28:31 | "taint" : | call_sensitivity.rb:27:27:27:27 | x | $@ | call_sensitivity.rb:28:25:28:31 | "taint" : | "taint" : |
3645
| call_sensitivity.rb:36:31:36:31 | x | call_sensitivity.rb:37:25:37:31 | "taint" : | call_sensitivity.rb:36:31:36:31 | x | $@ | call_sensitivity.rb:37:25:37:31 | "taint" : | "taint" : |
46+
| call_sensitivity.rb:39:32:39:32 | x | call_sensitivity.rb:40:26:40:32 | "taint" : | call_sensitivity.rb:39:32:39:32 | x | $@ | call_sensitivity.rb:40:26:40:32 | "taint" : | "taint" : |

ruby/ql/test/library-tests/dataflow/call-sensitivity/call_sensitivity.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,8 @@ def apply_lambda (lambda, x)
3636
my_lambda = lambda { |x| sink x }
3737
apply_lambda(my_lambda, "taint") # flow
3838

39+
MY_LAMBDA1 = lambda { |x| sink x }
40+
apply_lambda(MY_LAMBDA1, "taint") # flow
41+
42+
MY_LAMBDA2 = lambda { |x| puts x }
43+
apply_lambda(MY_LAMBDA2, "taint") # no flow

0 commit comments

Comments
 (0)