2017-12-03 144 views
7
fn main() { 
    let val = 0; 
    unsafe { foo(&val) } 
} 

extern "C" { 
    pub fn foo(val: *const u32); 
} 

Uygulama:Bir FFI işlevi, değiştirilemeyen bir değişkeni değiştirebilir mi? C

Tabii
void foo(unsigned* val) { *val=1; } 

, ben val: *mut u32 geçmelidir, ama ne bir iletmenin başvuru geçmesi halinde ne olur? Hangi derleyici kuralları geçerlidir? Yerel değişkene bir işaretçiyi iletmeme rağmen val değişmeden kalır mı?

cevap

6

I undefined behavior say: olmayan değişken veri mutasyona

- veri bir UnsafeCell<U> içinde içerdiği sürece yani, veri ortak referans veya bağlayıcı bir let ait veri) ile ulaşılabilir.

Ve bu şunları içerebilir:

  • Peşinde val kullanırsanız (örneğin bir kayıt değeri önbelleğe veya nedeniyle constant propagation) yaptığın yazıyor görmezden olabilir onu FFI-call
  • segfault FFI, başvurulan belleğin salt okunur olarak kullanılabildiğinden FFI'dan gelen görüntüde ilgisiz konumlarda görünebilir, çünkü derleyici belleği yeniden kullanır ve iyi tanımlanmış bir değere sahip olduğunu varsaydığından,
  • ve daha kötüsü :)
+0

Çok teşekkür ederim – wemagah