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

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

कार्यान्वयन:एक FFI समारोह एक चर कि परिवर्तनशील घोषित नहीं किया गया था संशोधित कर सकते हैं? सी में

void foo(unsigned* val) { *val=1; } 
बेशक

, मैं val: *mut u32 पारित करना चाहिए, लेकिन क्या ऐसा होता है कि मैं एक अपरिवर्तनीय संदर्भ पारित में क्या होता है? क्या संकलक नियम लागू होते हैं? val अपरिवर्तित ही रहेंगे करता है, भले ही मैं स्थानीय चर के लिए सूचक गुजर रहा हूँ?

उत्तर

6

मैं undefined behavior कहेंगे:

गैर परिवर्तनशील डेटा स्वचालित रूप से परिवर्तित - जो है, डेटा, जब तक कि डेटा एक UnsafeCell<U> के भीतर निहित है, एक साझा संदर्भ या एक let बंधन के स्वामित्व वाला डेटा) के माध्यम से पहुंच गया।

और यह शामिल हो सकता है:

  • यदि आप के बाद val का उपयोग यह FFI-फोन राईट तुमने किया था की अनदेखी हो सकता है (उदाहरण के लिए या एक रजिस्टर में मूल्य कैश्ड कारण constant propagation)
  • segfault एफएफआई में क्योंकि संदर्भित स्मृति केवल पढ़ने के लिए
  • एफएफआई से लिखना प्रतीत होता है कि असंबद्ध स्थानों में दिखाई दे सकता है क्योंकि संकलक ने स्मृति का पुन: उपयोग किया और माना कि इसका एक अच्छी तरह से परिभाषित मूल्य
  • और बदतर :)
+0

आपको बहुत बहुत धन्यवाद – wemagah

संबंधित मुद्दे