Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions ruby/ql/lib/codeql/ruby/ast/Control.qll
Original file line number Diff line number Diff line change
Expand Up @@ -355,7 +355,7 @@ class TernaryIfExpr extends ConditionalExpr, TTernaryIfExpr {
*/
class CaseExpr extends ControlExpr instanceof CaseExprImpl {
/**
* Gets the expression being compared, if any. For example, `foo` in the following example.
* Gets the expression being compared. For example, `foo` in the following example.
* ```rb
* case foo
* when 0
Expand All @@ -364,7 +364,7 @@ class CaseExpr extends ControlExpr instanceof CaseExprImpl {
* puts 'one'
* end
* ```
* There is no result for the following example:
* In the following example, the result is an implicit synthesized `true` literal.
* ```rb
* case
* when a then 0
Expand Down
6 changes: 5 additions & 1 deletion ruby/ql/lib/codeql/ruby/ast/internal/Control.qll
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,11 @@ class CaseWhenClause extends CaseExprImpl, TCaseExpr {

CaseWhenClause() { this = TCaseExpr(g) }

final override Expr getValue() { toGenerated(result) = g.getValue() }
final override Expr getValue() {
toGenerated(result) = g.getValue()
or
not exists(g.getValue()) and synthChild(this, -2, result)
}

final override AstNode getBranch(int n) {
// When branches map directly to WhenClause nodes
Expand Down
19 changes: 19 additions & 0 deletions ruby/ql/lib/codeql/ruby/ast/internal/Synthesis.qll
Original file line number Diff line number Diff line change
Expand Up @@ -2002,6 +2002,25 @@ private module CallableBodySynthesis {
}
}

private module CaseNoValueSynthesis {
pragma[nomagic]
private predicate caseNoValueSynthesis(AstNode parent, int i, Child child) {
// Synthesize a `true` literal as the value of a `case`/`when` expression that has no value
exists(Ruby::Case g |
not exists(g.getValue()) and
parent = TCaseExpr(g) and
child = SynthChild(BooleanLiteralKind(true)) and
i = -2
)
}

private class CaseNoValueSynthesisImpl extends Synthesis {
final override predicate child(AstNode parent, int i, Child child) {
caseNoValueSynthesis(parent, i, child)
}
}
}

private module CaseElseBranchSynthesis {
pragma[nomagic]
private predicate caseElseBranchSynthesis(AstNode parent, int i, Child child) {
Expand Down
1 change: 1 addition & 0 deletions ruby/ql/test/library-tests/ast/Ast.expected
Original file line number Diff line number Diff line change
Expand Up @@ -829,6 +829,7 @@ control/cases.rb:
# 13| getBody: [StmtSequence] else ...
# 14| getStmt: [IntegerLiteral] 300
# 18| getStmt: [CaseExpr] case ...
# 18| getValue: [BooleanLiteral] true
# 19| getBranch: [WhenClause] when ...
# 19| getPattern: [GTExpr] ... > ...
# 19| getAnOperand/getGreaterOperand/getLeftOperand/getReceiver: [LocalVariableAccess] a
Expand Down
2 changes: 2 additions & 0 deletions ruby/ql/test/library-tests/ast/ValueText.expected
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,7 @@ exprValue
| control/cases.rb:11:9:11:9 | d | 0 | int |
| control/cases.rb:12:5:12:7 | 200 | 200 | int |
| control/cases.rb:14:5:14:7 | 300 | 300 | int |
| control/cases.rb:18:1:22:3 | true | true | boolean |
| control/cases.rb:19:6:19:6 | a | 0 | int |
| control/cases.rb:19:10:19:10 | b | 0 | int |
| control/cases.rb:19:18:19:19 | 10 | 10 | int |
Expand Down Expand Up @@ -1094,6 +1095,7 @@ exprCfgNodeValue
| control/cases.rb:11:9:11:9 | d | 0 | int |
| control/cases.rb:12:5:12:7 | 200 | 200 | int |
| control/cases.rb:14:5:14:7 | 300 | 300 | int |
| control/cases.rb:18:1:22:3 | true | true | boolean |
| control/cases.rb:19:6:19:6 | a | 0 | int |
| control/cases.rb:19:10:19:10 | b | 0 | int |
| control/cases.rb:19:18:19:19 | 10 | 10 | int |
Expand Down
2 changes: 1 addition & 1 deletion ruby/ql/test/library-tests/ast/control/CaseExpr.expected
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
caseValues
| cases.rb:8:1:15:3 | case ... | cases.rb:8:6:8:6 | a |
| cases.rb:18:1:22:3 | case ... | cases.rb:18:1:22:3 | true |
| cases.rb:26:1:29:3 | case ... | cases.rb:26:6:26:9 | call to expr |
| cases.rb:31:1:37:3 | case ... | cases.rb:31:6:31:9 | call to expr |
| cases.rb:39:1:80:3 | case ... | cases.rb:39:6:39:9 | call to expr |
Expand All @@ -15,7 +16,6 @@ caseValues
| cases.rb:164:1:167:3 | case ... | cases.rb:165:3:165:5 | foo |
| cases.rb:169:1:172:3 | case ... | cases.rb:170:3:170:5 | foo |
caseNoValues
| cases.rb:18:1:22:3 | case ... |
caseElseBranches
| cases.rb:8:1:15:3 | case ... | cases.rb:13:1:14:7 | else ... |
| cases.rb:26:1:29:3 | case ... | cases.rb:28:3:28:12 | else ... |
Expand Down
302 changes: 151 additions & 151 deletions ruby/ql/test/library-tests/controlflow/graph/BasicBlocks.expected

Large diffs are not rendered by default.

23 changes: 12 additions & 11 deletions ruby/ql/test/library-tests/controlflow/graph/Cfg.expected
Original file line number Diff line number Diff line change
Expand Up @@ -649,7 +649,7 @@
| cfg.rb:39:1:39:4 | self | cfg.rb:39:11:39:12 | 42 | |
| cfg.rb:39:1:39:12 | call to puts | cfg.rb:41:6:41:7 | 10 | |
| cfg.rb:39:11:39:12 | 42 | cfg.rb:39:1:39:12 | call to puts | |
| cfg.rb:41:1:45:3 | case ... | cfg.rb:48:8:48:8 | b | |
| cfg.rb:41:1:45:3 | case ... | cfg.rb:47:1:50:3 | true | |
| cfg.rb:41:6:41:7 | 10 | cfg.rb:42:8:42:8 | 1 | |
| cfg.rb:42:3:42:24 | [match] when ... | cfg.rb:42:15:42:24 | self | match |
| cfg.rb:42:3:42:24 | [no-match] when ... | cfg.rb:43:8:43:8 | 2 | no-match |
Expand Down Expand Up @@ -679,26 +679,27 @@
| cfg.rb:44:13:44:18 | "many" | cfg.rb:44:8:44:18 | call to puts | |
| cfg.rb:44:14:44:17 | many | cfg.rb:44:13:44:18 | "many" | |
| cfg.rb:47:1:50:3 | case ... | cfg.rb:52:1:52:7 | chained | |
| cfg.rb:48:3:48:29 | [false] when ... | cfg.rb:49:8:49:8 | b | false |
| cfg.rb:48:3:48:29 | [true] when ... | cfg.rb:48:20:48:29 | self | true |
| cfg.rb:47:1:50:3 | true | cfg.rb:48:8:48:8 | b | |
| cfg.rb:48:3:48:29 | [match] when ... | cfg.rb:48:20:48:29 | self | match |
| cfg.rb:48:3:48:29 | [no-match] when ... | cfg.rb:49:8:49:8 | b | no-match |
| cfg.rb:48:8:48:8 | b | cfg.rb:48:13:48:13 | 1 | |
| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [false] when ... | false |
| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [true] when ... | true |
| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [match] when ... | match |
| cfg.rb:48:8:48:13 | ... == ... | cfg.rb:48:3:48:29 | [no-match] when ... | no-match |
| cfg.rb:48:13:48:13 | 1 | cfg.rb:48:8:48:13 | ... == ... | |
| cfg.rb:48:15:48:29 | then ... | cfg.rb:47:1:50:3 | case ... | |
| cfg.rb:48:20:48:29 | call to puts | cfg.rb:48:15:48:29 | then ... | |
| cfg.rb:48:20:48:29 | self | cfg.rb:48:26:48:28 | one | |
| cfg.rb:48:25:48:29 | "one" | cfg.rb:48:20:48:29 | call to puts | |
| cfg.rb:48:26:48:28 | one | cfg.rb:48:25:48:29 | "one" | |
| cfg.rb:49:3:49:37 | [false] when ... | cfg.rb:47:1:50:3 | case ... | false |
| cfg.rb:49:3:49:37 | [true] when ... | cfg.rb:49:27:49:37 | self | true |
| cfg.rb:49:3:49:37 | [match] when ... | cfg.rb:49:27:49:37 | self | match |
| cfg.rb:49:3:49:37 | [no-match] when ... | cfg.rb:47:1:50:3 | case ... | no-match |
| cfg.rb:49:8:49:8 | b | cfg.rb:49:13:49:13 | 0 | |
| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:3:49:37 | [true] when ... | true |
| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:16:49:16 | b | false |
| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:3:49:37 | [match] when ... | match |
| cfg.rb:49:8:49:13 | ... == ... | cfg.rb:49:16:49:16 | b | no-match |
| cfg.rb:49:13:49:13 | 0 | cfg.rb:49:8:49:13 | ... == ... | |
| cfg.rb:49:16:49:16 | b | cfg.rb:49:20:49:20 | 1 | |
| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [false] when ... | false |
| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [true] when ... | true |
| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [match] when ... | match |
| cfg.rb:49:16:49:20 | ... > ... | cfg.rb:49:3:49:37 | [no-match] when ... | no-match |
| cfg.rb:49:20:49:20 | 1 | cfg.rb:49:16:49:20 | ... > ... | |
| cfg.rb:49:22:49:37 | then ... | cfg.rb:47:1:50:3 | case ... | |
| cfg.rb:49:27:49:37 | call to puts | cfg.rb:49:22:49:37 | then ... | |
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -266,46 +266,46 @@ controls
| barrier-guards.rb:227:4:227:21 | [true] ... and ... | barrier-guards.rb:228:5:228:7 | self | true |
| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:227:4:227:21 | [true] ... and ... | true |
| barrier-guards.rb:227:21:227:21 | call to y | barrier-guards.rb:228:5:228:7 | self | true |
| barrier-guards.rb:232:1:233:19 | [true] when ... | barrier-guards.rb:233:5:233:7 | foo | true |
| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [false] when ... | false |
| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [true] when ... | true |
| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:233:5:233:7 | foo | true |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:238:1:238:26 | [false] when ... | false |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:238:1:238:26 | [true] when ... | false |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:238:6:238:8 | self | false |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:238:24:238:26 | foo | false |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:239:1:239:22 | [false] when ... | false |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:239:1:239:22 | [true] when ... | false |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:239:6:239:8 | foo | false |
| barrier-guards.rb:237:1:237:38 | [false] when ... | barrier-guards.rb:239:20:239:22 | foo | false |
| barrier-guards.rb:237:1:237:38 | [true] when ... | barrier-guards.rb:237:24:237:26 | foo | true |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [false] when ... | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [true] when ... | true |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:24:237:26 | foo | true |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [false] when ... | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [true] when ... | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:8 | self | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [false] when ... | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [true] when ... | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | false |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | false |
| barrier-guards.rb:238:1:238:26 | [false] when ... | barrier-guards.rb:239:1:239:22 | [false] when ... | false |
| barrier-guards.rb:238:1:238:26 | [false] when ... | barrier-guards.rb:239:1:239:22 | [true] when ... | false |
| barrier-guards.rb:238:1:238:26 | [false] when ... | barrier-guards.rb:239:6:239:8 | foo | false |
| barrier-guards.rb:238:1:238:26 | [false] when ... | barrier-guards.rb:239:20:239:22 | foo | false |
| barrier-guards.rb:238:1:238:26 | [true] when ... | barrier-guards.rb:238:24:238:26 | foo | true |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [false] when ... | false |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [true] when ... | true |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | true |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [false] when ... | false |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [true] when ... | false |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | false |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | false |
| barrier-guards.rb:239:1:239:22 | [true] when ... | barrier-guards.rb:239:20:239:22 | foo | true |
| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [false] when ... | false |
| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [true] when ... | true |
| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | true |
| barrier-guards.rb:232:1:233:19 | [match] when ... | barrier-guards.rb:233:5:233:7 | foo | match |
| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [match] when ... | match |
| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:232:1:233:19 | [no-match] when ... | no-match |
| barrier-guards.rb:232:6:232:17 | ... == ... | barrier-guards.rb:233:5:233:7 | foo | match |
| barrier-guards.rb:237:1:237:38 | [match] when ... | barrier-guards.rb:237:24:237:26 | foo | match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:1:238:26 | [match] when ... | no-match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:6:238:8 | self | no-match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:238:24:238:26 | foo | no-match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:6:239:8 | foo | no-match |
| barrier-guards.rb:237:1:237:38 | [no-match] when ... | barrier-guards.rb:239:20:239:22 | foo | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [match] when ... | match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:1:237:38 | [no-match] when ... | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:237:24:237:26 | foo | match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [match] when ... | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:6:238:8 | self | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | no-match |
| barrier-guards.rb:237:6:237:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | no-match |
| barrier-guards.rb:238:1:238:26 | [match] when ... | barrier-guards.rb:238:24:238:26 | foo | match |
| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match |
| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match |
| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:6:239:8 | foo | no-match |
| barrier-guards.rb:238:1:238:26 | [no-match] when ... | barrier-guards.rb:239:20:239:22 | foo | no-match |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [match] when ... | match |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:1:238:26 | [no-match] when ... | no-match |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:238:24:238:26 | foo | match |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | no-match |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:6:239:8 | foo | no-match |
| barrier-guards.rb:238:6:238:17 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | no-match |
| barrier-guards.rb:239:1:239:22 | [match] when ... | barrier-guards.rb:239:20:239:22 | foo | match |
| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [match] when ... | match |
| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:1:239:22 | [no-match] when ... | no-match |
| barrier-guards.rb:239:6:239:13 | ... == ... | barrier-guards.rb:239:20:239:22 | foo | match |
| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:244:5:244:7 | foo | match |
| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:245:1:246:7 | in ... then ... | no-match |
| barrier-guards.rb:243:4:243:8 | "foo" | barrier-guards.rb:246:5:246:7 | foo | no-match |
Expand Down
Loading