File tree Expand file tree Collapse file tree 4 files changed +18
-4
lines changed
lib/codeql/ruby/controlflow Expand file tree Collapse file tree 4 files changed +18
-4
lines changed Original file line number Diff line number Diff line change @@ -37,8 +37,14 @@ private module Input implements InputSig<RubyDataFlow> {
37
37
}
38
38
39
39
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
+ )
42
48
}
43
49
}
44
50
Original file line number Diff line number Diff line change @@ -7,7 +7,6 @@ private import codeql.ruby.ast.internal.Constant
7
7
private import codeql.ruby.ast.internal.Literal
8
8
private import ControlFlowGraph
9
9
private import internal.ControlFlowGraphImpl as CfgImpl
10
- private import internal.Splitting
11
10
12
11
/** An entry node for a given scope. */
13
12
class EntryNode extends CfgNode , CfgImpl:: EntryNode {
Original file line number Diff line number Diff line change @@ -4,7 +4,7 @@ private import codeql.ruby.AST
4
4
private import codeql.ruby.controlflow.BasicBlocks
5
5
private import SuccessorTypes
6
6
private import internal.ControlFlowGraphImpl as CfgImpl
7
- private import internal.Splitting
7
+ private import internal.Splitting as Splitting
8
8
private import internal.Completion
9
9
10
10
/**
@@ -293,3 +293,10 @@ module SuccessorTypes {
293
293
final override string toString ( ) { result = "exit" }
294
294
}
295
295
}
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
+ }
Original file line number Diff line number Diff line change @@ -115,6 +115,8 @@ private module ConditionalCompletionSplitting {
115
115
}
116
116
}
117
117
118
+ class ConditionalCompletionSplit = ConditionalCompletionSplitting:: ConditionalCompletionSplit ;
119
+
118
120
module EnsureSplitting {
119
121
/**
120
122
* The type of a split `ensure` node.
You can’t perform that action at this time.
0 commit comments