Potentially Inconsistent Coordinate Slicing #299
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Replaced potentially unexpected accesses to coordinate slices with consistent ranges no matter if the raw representation is a root or a slice of data.
Checklist
If you've made changes to
gyb
files.script/generate_boilerplate_files_with_gyb
and included updated generated files in a commit of this pull requestMotivation:
As discussed in slack,
.prefix(upTo:)
and.suffix(from:)
are problematic when you don't know the origin ofData
, as a slice of Data can have a non-zerostartIndex
, causing downstream misalignment. For myself, this happened when I tried accessing therawRepresentation
of an ECDSA's PublicKey, which was derived from the x963 representation, and thus had a start offset of 1. Although the code performed as expected, this seemed like a mistake waiting to happen as changing howrawRepresentation
is derived for signatures could cause a similar headache in the future, especially so for anyone reading the code as a reference (it me!).Modifications:
Since the use cases here were to split the
Data
in half, I replaced the uses of.prefix(upTo:)
and.suffix(from:)
with.prefix()
and.suffix()
respectfully.Result:
No change to behavior, but more semantically correct code.