Skip to content

Commit 66a24c5

Browse files
committed
Ruby: Introduce TAnyArrayElementContent
1 parent 497c878 commit 66a24c5

File tree

3 files changed

+19
-7
lines changed

3 files changed

+19
-7
lines changed

ruby/ql/lib/codeql/ruby/dataflow/FlowSummary.qll

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,7 @@ module SummaryComponent {
4747
* index or known index. This predicate should never be used in the output specification
4848
* of a flow summary; use `arrayElementUnknown()` instead.
4949
*/
50-
SummaryComponent arrayElementAny() {
51-
result in [arrayElementUnknown(), SC::content(TKnownArrayElementContent(_))]
52-
}
50+
SummaryComponent arrayElementAny() { result = SC::content(TAnyArrayElementContent()) }
5351

5452
/** Gets a summary component that represents the return value of a call. */
5553
SummaryComponent return() { result = SC::return(any(NormalReturnKind rk)) }

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,8 @@ private module Cached {
296296
cached
297297
newtype TContent =
298298
TKnownArrayElementContent(int i) { i in [0 .. 10] } or
299-
TUnknownArrayElementContent()
299+
TUnknownArrayElementContent() or
300+
TAnyArrayElementContent()
300301
}
301302

302303
class TArrayElementContent = TKnownArrayElementContent or TUnknownArrayElementContent;
@@ -736,7 +737,13 @@ predicate storeStep(Node node1, Content c, Node node2) {
736737
}
737738

738739
predicate readStep(Node node1, Content c, Node node2) {
739-
FlowSummaryImpl::Private::Steps::summaryReadStep(node1, c, node2)
740+
exists(Content c0 | FlowSummaryImpl::Private::Steps::summaryReadStep(node1, c0, node2) |
741+
if c0 = TAnyArrayElementContent()
742+
then
743+
c instanceof TUnknownArrayElementContent or
744+
c instanceof TKnownArrayElementContent
745+
else c = c0
746+
)
740747
}
741748

742749
/**

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,17 @@ module Content {
189189

190190
/** An element in an array at an unknown index. */
191191
class UnknownArrayElementContent extends ArrayElementContent, TUnknownArrayElementContent {
192-
UnknownArrayElementContent() { this = TUnknownArrayElementContent() }
193-
194192
override string toString() { result = "array element" }
195193
}
194+
195+
/**
196+
* Used internally only, to represent the union of `KnownArrayElementContent`
197+
* and `UnknownArrayElementContent`, to avoid combinatorial explosions in
198+
* `SummaryComponentStack`s in flow summaries.
199+
*/
200+
private class AnyArrayElementContent extends Content, TAnyArrayElementContent {
201+
override string toString() { result = "any array element" }
202+
}
196203
}
197204

198205
/**

0 commit comments

Comments
 (0)