Protocol: debug_assert!() Span to reflect a valid slice (#6806)

Also enforce this by #[non_exhaustive] span such that going forward we
cannot, in debug builds (1), construct invalid spans.

The motivation for this stems from #6431 where I've seen crashes due to
invalid slice indexing.

My hope is this will mitigate such senarios

1. https://github.com/nushell/nushell/pull/6431#issuecomment-1278147241

# Description

(description of your pull request here)

# Tests

Make sure you've done the following:

- [ ] Add tests that cover your changes, either in the command examples,
the crate/tests folder, or in the /tests folder.
- [ ] Try to think about corner cases and various ways how your changes
could break. Cover them with tests.
- [ ] If adding tests is not possible, please document in the PR body a
minimal example with steps on how to reproduce so one can verify your
change works.

Make sure you've run and fixed any issues with these commands:

- [x] `cargo fmt --all -- --check` to check standard code formatting
(`cargo fmt --all` applies these changes)
- [ ] `cargo clippy --workspace --features=extra -- -D warnings -D
clippy::unwrap_used -A clippy::needless_collect` to check that you're
using the standard code style
- [ ] `cargo test --workspace --features=extra` to check that all the
tests pass

# Documentation

- [ ] If your PR touches a user-facing nushell feature then make sure
that there is an entry in the documentation
(https://github.com/nushell/nushell.github.io) for the feature, and
update it if necessary.
This commit is contained in:
Daniel Buch Hansen
2022-12-03 10:44:12 +01:00
committed by GitHub
parent e6cf18ea43
commit 850ecf648a
36 changed files with 200 additions and 418 deletions

View File

@ -78,29 +78,29 @@ mod tests {
let input = Value::Bool {
val: false,
span: Span { start: 1, end: 20 },
span: Span::new(1, 20),
};
let call = EvaluatedCall {
head: Span { start: 0, end: 10 },
head: Span::new(0, 10),
positional: vec![
Value::Float {
val: 1.0,
span: Span { start: 0, end: 10 },
span: Span::new(0, 10),
},
Value::String {
val: "something".into(),
span: Span { start: 0, end: 10 },
span: Span::new(0, 10),
},
],
named: vec![(
Spanned {
item: "name".to_string(),
span: Span { start: 0, end: 10 },
span: Span::new(0, 10),
},
Some(Value::Float {
val: 1.0,
span: Span { start: 0, end: 10 },
span: Span::new(0, 10),
}),
)],
};
@ -154,7 +154,7 @@ mod tests {
#[test]
fn callinfo_round_trip_collapsecustomvalue() {
let data = vec![1, 2, 3, 4, 5, 6, 7];
let span = Span { start: 0, end: 20 };
let span = Span::new(0, 20);
let collapse_custom_value = PluginCall::CollapseCustomValue(PluginData {
data: data.clone(),
@ -246,7 +246,7 @@ mod tests {
fn response_round_trip_value() {
let value = Value::Int {
val: 10,
span: Span { start: 2, end: 30 },
span: Span::new(2, 30),
};
let response = PluginResponse::Value(Box::new(value.clone()));
@ -275,7 +275,7 @@ mod tests {
let name = "test".to_string();
let data = vec![1, 2, 3, 4, 5];
let span = Span { start: 2, end: 30 };
let span = Span::new(2, 30);
let response = PluginResponse::PluginData(
name.clone(),
@ -311,7 +311,7 @@ mod tests {
let error = LabeledError {
label: "label".into(),
msg: "msg".into(),
span: Some(Span { start: 2, end: 30 }),
span: Some(Span::new(2, 30)),
};
let response = PluginResponse::Error(error.clone());