amethyst / amethyst/legion

Soundness issue with random access API within a system

Offen
#129 2 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Rust
Sterne
1.7k
Forks
140
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

The following snippet demonstrates the issue (only occurs when building with `--release`):

```rust
use legion::prelude::*;

fn main() {
let mut world = World::new();

world.insert((), Some((14u32,)));

let query = >::query();
let system = SystemBuilder::new("soundness issue")
.write_component::()
.with_query(query)
.build(|_, world, _, query| {
for (entity, mut number) in query.iter_entities(world) {
dbg!(&number); // prints 14
*number += 1;
dbg!(&number); // prints 15

let mut number2 = world.get_component_mut::(entity).unwrap();
dbg!(&number); // prints 15
dbg!(&number2); // prints 15
*number2 += 1;

dbg!(&number); // prints 16
dbg!(&number2); // prints 16
}
});

system.run(&world);
}
```

As far as I can tell this is due to some lifetime issue in `Query::iter_entities` or the fact that runtime borrow checking is disabled in release builds. While I am not against such an optimization, this clearly violates Rust's soundness and aliasing guarantees.

For users who still need/want such an optimization, would it be possible to make this an opt-in feature instead? This has the benefit of making potential issues more visible to the developer.

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.