Skip to content

Commit b470c36

Browse files
committed
Ruby: Implement multipleArgumentCallExclude
1 parent c13a8e4 commit b470c36

File tree

4 files changed

+18
-4
lines changed

4 files changed

+18
-4
lines changed

ruby/ql/consistency-queries/DataFlowConsistency.ql

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,14 @@ private module Input implements InputSig<RubyDataFlow> {
3737
}
3838

3939
predicate multipleArgumentCallExclude(ArgumentNode arg, DataFlowCall call) {
40-
arg.asExpr().getASuccessor(any(SuccessorTypes::ConditionalSuccessor c)).getASuccessor() =
41-
call.asCall()
40+
// An argument such as `x` in `if not x then ...` has two successors (and hence
41+
// two calls); one for each Boolean outcome of `x`.
42+
exists(CfgNodes::ExprCfgNode n |
43+
arg.argumentOf(call, _) and
44+
n = call.asCall() and
45+
arg.asExpr().getASuccessor(any(SuccessorTypes::ConditionalSuccessor c)).getASuccessor*() = n and
46+
n.getASplit() instanceof Split::ConditionalCompletionSplit
47+
)
4248
}
4349
}
4450

ruby/ql/lib/codeql/ruby/controlflow/CfgNodes.qll

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ private import codeql.ruby.ast.internal.Constant
77
private import codeql.ruby.ast.internal.Literal
88
private import ControlFlowGraph
99
private import internal.ControlFlowGraphImpl as CfgImpl
10-
private import internal.Splitting
1110

1211
/** An entry node for a given scope. */
1312
class EntryNode extends CfgNode, CfgImpl::EntryNode {

ruby/ql/lib/codeql/ruby/controlflow/ControlFlowGraph.qll

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ private import codeql.ruby.AST
44
private import codeql.ruby.controlflow.BasicBlocks
55
private import SuccessorTypes
66
private import internal.ControlFlowGraphImpl as CfgImpl
7-
private import internal.Splitting
7+
private import internal.Splitting as Splitting
88
private import internal.Completion
99

1010
/**
@@ -293,3 +293,10 @@ module SuccessorTypes {
293293
final override string toString() { result = "exit" }
294294
}
295295
}
296+
297+
class Split = Splitting::Split;
298+
299+
/** Provides different kinds of control flow graph splittings. */
300+
module Split {
301+
class ConditionalCompletionSplit = Splitting::ConditionalCompletionSplit;
302+
}

ruby/ql/lib/codeql/ruby/controlflow/internal/Splitting.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,8 @@ private module ConditionalCompletionSplitting {
115115
}
116116
}
117117

118+
class ConditionalCompletionSplit = ConditionalCompletionSplitting::ConditionalCompletionSplit;
119+
118120
module EnsureSplitting {
119121
/**
120122
* The type of a split `ensure` node.

0 commit comments

Comments
 (0)