Skip to content

Commit d9428f4

Browse files
authored
Merge pull request #22397 from aschackmull/ruby/qltest-beginexpr
Ruby: Document missing BeginExpr flow.
2 parents 1ee9158 + 054af50 commit d9428f4

4 files changed

Lines changed: 144 additions & 7 deletions

File tree

ruby/ql/test/library-tests/dataflow/local/DataflowStep.expected

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2504,9 +2504,9 @@
25042504
| UseUseExplosion.rb:24:5:25:7 | use | UseUseExplosion.rb:1:1:26:3 | C |
25052505
| local_dataflow.rb:1:1:7:3 | self (foo) | local_dataflow.rb:3:8:3:10 | self |
25062506
| local_dataflow.rb:1:1:7:3 | self in foo | local_dataflow.rb:1:1:7:3 | self (foo) |
2507-
| local_dataflow.rb:1:1:150:3 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
2508-
| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
2509-
| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) |
2507+
| local_dataflow.rb:1:1:174:4 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
2508+
| local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
2509+
| local_dataflow.rb:1:1:174:4 | self in local_dataflow.rb | local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) |
25102510
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a |
25112511
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a |
25122512
| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b |
@@ -2979,3 +2979,42 @@
29792979
| local_dataflow.rb:147:9:147:9 | [post] x | local_dataflow.rb:148:9:148:9 | x |
29802980
| local_dataflow.rb:147:9:147:9 | x | local_dataflow.rb:148:9:148:9 | x |
29812981
| local_dataflow.rb:148:5:148:10 | call to use | local_dataflow.rb:132:12:148:10 | then ... |
2982+
| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:154:9:154:21 | self |
2983+
| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:155:9:155:17 | self |
2984+
| local_dataflow.rb:152:1:174:3 | self in begin_expr | local_dataflow.rb:152:1:174:3 | self (begin_expr) |
2985+
| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r |
2986+
| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r |
2987+
| local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x |
2988+
| local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self |
2989+
| local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self |
2990+
| local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r |
2991+
| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self |
2992+
| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:159:9:159:17 | self |
2993+
| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:157:9:157:17 | self |
2994+
| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:159:9:159:17 | self |
2995+
| local_dataflow.rb:157:9:157:17 | [post] self | local_dataflow.rb:159:9:159:17 | self |
2996+
| local_dataflow.rb:157:9:157:17 | call to source | local_dataflow.rb:156:13:157:17 | then ... |
2997+
| local_dataflow.rb:157:9:157:17 | self | local_dataflow.rb:159:9:159:17 | self |
2998+
| local_dataflow.rb:159:9:159:17 | [post] self | local_dataflow.rb:161:3:161:9 | self |
2999+
| local_dataflow.rb:159:9:159:17 | call to source | local_dataflow.rb:158:7:159:17 | ensure ... |
3000+
| local_dataflow.rb:159:9:159:17 | self | local_dataflow.rb:161:3:161:9 | self |
3001+
| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:164:9:164:21 | self |
3002+
| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:165:9:165:17 | self |
3003+
| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self |
3004+
| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self |
3005+
| local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y |
3006+
| local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self |
3007+
| local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self |
3008+
| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self |
3009+
| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self |
3010+
| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:167:9:167:17 | self |
3011+
| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:169:9:169:17 | self |
3012+
| local_dataflow.rb:167:9:167:17 | [post] self | local_dataflow.rb:171:9:171:17 | self |
3013+
| local_dataflow.rb:167:9:167:17 | call to source | local_dataflow.rb:166:13:167:17 | then ... |
3014+
| local_dataflow.rb:167:9:167:17 | self | local_dataflow.rb:171:9:171:17 | self |
3015+
| local_dataflow.rb:169:9:169:17 | [post] self | local_dataflow.rb:171:9:171:17 | self |
3016+
| local_dataflow.rb:169:9:169:17 | call to source | local_dataflow.rb:168:7:169:17 | else ... |
3017+
| local_dataflow.rb:169:9:169:17 | self | local_dataflow.rb:171:9:171:17 | self |
3018+
| local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self |
3019+
| local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... |
3020+
| local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self |

ruby/ql/test/library-tests/dataflow/local/Nodes.expected

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ ret
2121
| local_dataflow.rb:123:32:123:43 | call to puts |
2222
| local_dataflow.rb:127:3:127:8 | call to rand |
2323
| local_dataflow.rb:132:3:149:5 | if ... |
24+
| local_dataflow.rb:173:3:173:9 | call to sink |
2425
arg
2526
| UseUseExplosion.rb:20:13:20:17 | @prop | UseUseExplosion.rb:20:13:20:23 | ... > ... | self |
2627
| UseUseExplosion.rb:20:13:20:23 | synthetic splat argument | UseUseExplosion.rb:20:13:20:23 | ... > ... | synthetic * |
@@ -1524,3 +1525,36 @@ arg
15241525
| local_dataflow.rb:148:5:148:10 | self | local_dataflow.rb:148:5:148:10 | call to use | self |
15251526
| local_dataflow.rb:148:5:148:10 | synthetic splat argument | local_dataflow.rb:148:5:148:10 | call to use | synthetic * |
15261527
| local_dataflow.rb:148:9:148:9 | x | local_dataflow.rb:148:5:148:10 | call to use | position 0 |
1528+
| local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:154:9:154:21 | call to raise | self |
1529+
| local_dataflow.rb:154:9:154:21 | synthetic splat argument | local_dataflow.rb:154:9:154:21 | call to raise | synthetic * |
1530+
| local_dataflow.rb:154:15:154:21 | "error" | local_dataflow.rb:154:9:154:21 | call to raise | position 0 |
1531+
| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:155:9:155:17 | call to source | self |
1532+
| local_dataflow.rb:155:9:155:17 | synthetic splat argument | local_dataflow.rb:155:9:155:17 | call to source | synthetic * |
1533+
| local_dataflow.rb:155:16:155:16 | 1 | local_dataflow.rb:155:9:155:17 | call to source | position 0 |
1534+
| local_dataflow.rb:157:9:157:17 | self | local_dataflow.rb:157:9:157:17 | call to source | self |
1535+
| local_dataflow.rb:157:9:157:17 | synthetic splat argument | local_dataflow.rb:157:9:157:17 | call to source | synthetic * |
1536+
| local_dataflow.rb:157:16:157:16 | 2 | local_dataflow.rb:157:9:157:17 | call to source | position 0 |
1537+
| local_dataflow.rb:159:9:159:17 | self | local_dataflow.rb:159:9:159:17 | call to source | self |
1538+
| local_dataflow.rb:159:9:159:17 | synthetic splat argument | local_dataflow.rb:159:9:159:17 | call to source | synthetic * |
1539+
| local_dataflow.rb:159:16:159:16 | 3 | local_dataflow.rb:159:9:159:17 | call to source | position 0 |
1540+
| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:161:3:161:9 | call to sink | self |
1541+
| local_dataflow.rb:161:3:161:9 | synthetic splat argument | local_dataflow.rb:161:3:161:9 | call to sink | synthetic * |
1542+
| local_dataflow.rb:161:8:161:8 | x | local_dataflow.rb:161:3:161:9 | call to sink | position 0 |
1543+
| local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:164:9:164:21 | call to raise | self |
1544+
| local_dataflow.rb:164:9:164:21 | synthetic splat argument | local_dataflow.rb:164:9:164:21 | call to raise | synthetic * |
1545+
| local_dataflow.rb:164:15:164:21 | "error" | local_dataflow.rb:164:9:164:21 | call to raise | position 0 |
1546+
| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:165:9:165:17 | call to source | self |
1547+
| local_dataflow.rb:165:9:165:17 | synthetic splat argument | local_dataflow.rb:165:9:165:17 | call to source | synthetic * |
1548+
| local_dataflow.rb:165:16:165:16 | 4 | local_dataflow.rb:165:9:165:17 | call to source | position 0 |
1549+
| local_dataflow.rb:167:9:167:17 | self | local_dataflow.rb:167:9:167:17 | call to source | self |
1550+
| local_dataflow.rb:167:9:167:17 | synthetic splat argument | local_dataflow.rb:167:9:167:17 | call to source | synthetic * |
1551+
| local_dataflow.rb:167:16:167:16 | 5 | local_dataflow.rb:167:9:167:17 | call to source | position 0 |
1552+
| local_dataflow.rb:169:9:169:17 | self | local_dataflow.rb:169:9:169:17 | call to source | self |
1553+
| local_dataflow.rb:169:9:169:17 | synthetic splat argument | local_dataflow.rb:169:9:169:17 | call to source | synthetic * |
1554+
| local_dataflow.rb:169:16:169:16 | 6 | local_dataflow.rb:169:9:169:17 | call to source | position 0 |
1555+
| local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:171:9:171:17 | call to source | self |
1556+
| local_dataflow.rb:171:9:171:17 | synthetic splat argument | local_dataflow.rb:171:9:171:17 | call to source | synthetic * |
1557+
| local_dataflow.rb:171:16:171:16 | 7 | local_dataflow.rb:171:9:171:17 | call to source | position 0 |
1558+
| local_dataflow.rb:173:3:173:9 | self | local_dataflow.rb:173:3:173:9 | call to sink | self |
1559+
| local_dataflow.rb:173:3:173:9 | synthetic splat argument | local_dataflow.rb:173:3:173:9 | call to sink | synthetic * |
1560+
| local_dataflow.rb:173:8:173:8 | y | local_dataflow.rb:173:3:173:9 | call to sink | position 0 |

ruby/ql/test/library-tests/dataflow/local/TaintStep.expected

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2951,9 +2951,9 @@
29512951
| local_dataflow.rb:1:1:7:3 | self (foo) | local_dataflow.rb:3:8:3:10 | self |
29522952
| local_dataflow.rb:1:1:7:3 | self in foo | local_dataflow.rb:1:1:7:3 | self (foo) |
29532953
| local_dataflow.rb:1:1:7:3 | synthetic splat parameter | local_dataflow.rb:1:9:1:9 | a |
2954-
| local_dataflow.rb:1:1:150:3 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
2955-
| local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
2956-
| local_dataflow.rb:1:1:150:3 | self in local_dataflow.rb | local_dataflow.rb:1:1:150:3 | self (local_dataflow.rb) |
2954+
| local_dataflow.rb:1:1:174:4 | <uninitialized> x | local_dataflow.rb:10:9:10:9 | x |
2955+
| local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) | local_dataflow.rb:49:1:53:3 | self |
2956+
| local_dataflow.rb:1:1:174:4 | self in local_dataflow.rb | local_dataflow.rb:1:1:174:4 | self (local_dataflow.rb) |
29572957
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:1:9:1:9 | a |
29582958
| local_dataflow.rb:1:9:1:9 | a | local_dataflow.rb:2:7:2:7 | a |
29592959
| local_dataflow.rb:2:3:2:3 | b | local_dataflow.rb:3:13:3:13 | b |
@@ -3474,3 +3474,43 @@
34743474
| local_dataflow.rb:147:9:147:9 | [post] x | local_dataflow.rb:148:9:148:9 | x |
34753475
| local_dataflow.rb:147:9:147:9 | x | local_dataflow.rb:148:9:148:9 | x |
34763476
| local_dataflow.rb:148:5:148:10 | call to use | local_dataflow.rb:132:12:148:10 | then ... |
3477+
| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:154:9:154:21 | self |
3478+
| local_dataflow.rb:152:1:174:3 | self (begin_expr) | local_dataflow.rb:155:9:155:17 | self |
3479+
| local_dataflow.rb:152:1:174:3 | self in begin_expr | local_dataflow.rb:152:1:174:3 | self (begin_expr) |
3480+
| local_dataflow.rb:152:1:174:3 | synthetic splat parameter | local_dataflow.rb:152:16:152:16 | r |
3481+
| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:152:16:152:16 | r |
3482+
| local_dataflow.rb:152:16:152:16 | r | local_dataflow.rb:154:26:154:26 | r |
3483+
| local_dataflow.rb:153:3:153:3 | x | local_dataflow.rb:161:8:161:8 | x |
3484+
| local_dataflow.rb:154:9:154:21 | [post] self | local_dataflow.rb:157:9:157:17 | self |
3485+
| local_dataflow.rb:154:9:154:21 | self | local_dataflow.rb:157:9:157:17 | self |
3486+
| local_dataflow.rb:154:26:154:26 | r | local_dataflow.rb:164:26:164:26 | r |
3487+
| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:157:9:157:17 | self |
3488+
| local_dataflow.rb:155:9:155:17 | [post] self | local_dataflow.rb:159:9:159:17 | self |
3489+
| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:157:9:157:17 | self |
3490+
| local_dataflow.rb:155:9:155:17 | self | local_dataflow.rb:159:9:159:17 | self |
3491+
| local_dataflow.rb:157:9:157:17 | [post] self | local_dataflow.rb:159:9:159:17 | self |
3492+
| local_dataflow.rb:157:9:157:17 | call to source | local_dataflow.rb:156:13:157:17 | then ... |
3493+
| local_dataflow.rb:157:9:157:17 | self | local_dataflow.rb:159:9:159:17 | self |
3494+
| local_dataflow.rb:159:9:159:17 | [post] self | local_dataflow.rb:161:3:161:9 | self |
3495+
| local_dataflow.rb:159:9:159:17 | call to source | local_dataflow.rb:158:7:159:17 | ensure ... |
3496+
| local_dataflow.rb:159:9:159:17 | self | local_dataflow.rb:161:3:161:9 | self |
3497+
| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:164:9:164:21 | self |
3498+
| local_dataflow.rb:161:3:161:9 | [post] self | local_dataflow.rb:165:9:165:17 | self |
3499+
| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:164:9:164:21 | self |
3500+
| local_dataflow.rb:161:3:161:9 | self | local_dataflow.rb:165:9:165:17 | self |
3501+
| local_dataflow.rb:163:3:163:3 | y | local_dataflow.rb:173:8:173:8 | y |
3502+
| local_dataflow.rb:164:9:164:21 | [post] self | local_dataflow.rb:167:9:167:17 | self |
3503+
| local_dataflow.rb:164:9:164:21 | self | local_dataflow.rb:167:9:167:17 | self |
3504+
| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:167:9:167:17 | self |
3505+
| local_dataflow.rb:165:9:165:17 | [post] self | local_dataflow.rb:169:9:169:17 | self |
3506+
| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:167:9:167:17 | self |
3507+
| local_dataflow.rb:165:9:165:17 | self | local_dataflow.rb:169:9:169:17 | self |
3508+
| local_dataflow.rb:167:9:167:17 | [post] self | local_dataflow.rb:171:9:171:17 | self |
3509+
| local_dataflow.rb:167:9:167:17 | call to source | local_dataflow.rb:166:13:167:17 | then ... |
3510+
| local_dataflow.rb:167:9:167:17 | self | local_dataflow.rb:171:9:171:17 | self |
3511+
| local_dataflow.rb:169:9:169:17 | [post] self | local_dataflow.rb:171:9:171:17 | self |
3512+
| local_dataflow.rb:169:9:169:17 | call to source | local_dataflow.rb:168:7:169:17 | else ... |
3513+
| local_dataflow.rb:169:9:169:17 | self | local_dataflow.rb:171:9:171:17 | self |
3514+
| local_dataflow.rb:171:9:171:17 | [post] self | local_dataflow.rb:173:3:173:9 | self |
3515+
| local_dataflow.rb:171:9:171:17 | call to source | local_dataflow.rb:170:7:171:17 | ensure ... |
3516+
| local_dataflow.rb:171:9:171:17 | self | local_dataflow.rb:173:3:173:9 | self |

ruby/ql/test/library-tests/dataflow/local/local_dataflow.rb

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,28 @@ def use_use_madness
147147
use(x)
148148
use(x)
149149
end
150-
end
150+
end
151+
152+
def begin_expr r
153+
x = begin
154+
raise "error" if r
155+
source(1)
156+
rescue
157+
source(2)
158+
ensure
159+
source(3)
160+
end
161+
sink(x) # $ MISSING: hasValueFlow=1 hasValueFlow=2
162+
163+
y = begin
164+
raise "error" if r
165+
source(4)
166+
rescue
167+
source(5)
168+
else
169+
source(6)
170+
ensure
171+
source(7)
172+
end
173+
sink(y) # $ MISSING: hasValueFlow=5 hasValueFlow=6
174+
end

0 commit comments

Comments
 (0)