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

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

thực hiện trong C:Chức năng FFI có thể sửa đổi một biến không được khai báo có thể thay đổi được không?

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

Tất nhiên, tôi phải vượt qua val: *mut u32, nhưng những gì xảy ra trong trường hợp mà tôi vượt qua một tài liệu tham khảo không thay đổi? Quy tắc biên dịch nào áp dụng? Liệu val vẫn không thay đổi mặc dù tôi đang chuyển một con trỏ tới biến cục bộ?

Trả lời

6

Tôi muốn nói undefined behavior:

biến đổi dữ liệu không thể thay đổi - đó là, dữ liệu đạt được thông qua một tài liệu tham khảo chia sẻ hoặc dữ liệu thuộc sở hữu của một let ràng buộc), trừ khi dữ liệu được chứa trong một UnsafeCell<U>.

Và điều này có thể bao gồm:

  • nếu bạn sử dụng val sau FFI-gọi nó là có thể bỏ qua viết bạn đã làm (ví dụ như lưu trữ các giá trị trong một thanh ghi hoặc do constant propagation)
  • segfault trong FFI vì bộ nhớ tham chiếu có thể là chỉ đọc
  • ghi từ FFI có thể hiển thị ở các vị trí dường như không liên quan vì trình biên dịch sử dụng lại bộ nhớ và giả định nó có giá trị được xác định rõ ràng
  • và tệ hơn :)
+0

Cảm ơn bạn rất nhiều – wemagah

Các vấn đề liên quan