Warum ist diese Zeigerarithmetik (ohne dass Daten hinter diesen Zeigern gelesen oder geschrieben werden) die Ursache eines Segmentfehlers?Warum ist Zeigerarithmetik die Ursache eines segfault?
#![allow(dead_code,unused_variables)]
use std::cell::Cell;
struct Bar<T: ?Sized> {
a: Cell<usize>,
value: T,
}
unsafe fn foo<T: ?Sized>(v: &T) {
let fake: &Bar<T> = std::mem::zeroed();
// segfault on this line
// we are not reading or writing uninitialized data behind the reference,
// but only doing pointer arithmetic. We are not reading or writing
// uninitialized vtable, but only copy the vtable pointer.
let fake_val = &fake.value;
}
fn main() {
use std::any::Any;
let some_ref: &Any = &42 as &Any;
unsafe { foo(some_ref) };
}
Ausgang: Segmentation fault
Wenn es sicher ist, einen ungeordneten Zeiger mit einem rohen Zeiger zu haben, warum zeigt dies das gleiche Verhalten wie der OP-Code (z. B. schlägt in Debug "funktioniert" in Release) https: //play.rust-lang. org /? gist = 23baa08f2c83609e002f33b3e2852543 & version = stabil – Timidger
@Timidger Da du den Zeiger in der zweiten Zeile dereferenzierst. Die Dereferenzierung eines baumelnden Zeigers ist natürlich nicht erlaubt. Sie können also den Zeiger auf das Feld nicht mit dem Operator '. Um ehrlich zu sein, ich weiß nicht, was der beste Weg ist, einen solchen Zeiger auf ein Feld zu erhalten. Besser eine andere Frage stellen! :) –