mirror of
https://github.com/github/codeql.git
synced 2026-07-30 15:05:38 +02:00
This requires a bit of explanation, so strap in. Firstly, because we use `LocalSourceNode`s as the start and end points of our `StepSummary::step` relation, there's no need to include `simpleLocalFlowStep` (via `typePreservingStep`) in `smallstep`. Indeed, since the successor node for a `step` is a `LocalSourceNode`, and local sources never have incoming flow, this is entirely futile -- we can find values for `mid` and `nodeTo` that satisfy the body of `step`, but `nodeTo` will never be a `LocalSourceNode`. With this in mind, we can simplify `smallstep` to only refer to `jumpStep`. This then brings the other uses of `typePreservingStep` into question. The only other place we use this predicate is in the `TypeTracker` and `TypeBackTracker` `smallstep` predicates. Note, however, that here we no longer need `jumpStep` to be part of `typeTrackingStep` (as it is already accounted for in `StepSummary::smallstep`) so we can simplify to `simpleLocalFlowStep`. At this point, `typePreservingStep` is unused. Finally, because of the way `smallstep` is used in `step` (inside `StepSummary`), `nodeTo` must always be a `LocalSourceNode`, so I have propagated this restriction to `smallstep` as well. We can always lift this restriction later, but for now it seems like it's likely to cause fewer surprises to have made this explicit.