هل هناك أي سبب محدد لاستخدامك للوظائف unsafe
block بدلاً من unsafe
block في أماكن مثل هذه ؟
ألن يكون من الأفضل / الدقيق كتابته على النحو التالي:
#[no_mangle]
pub unsafe extern fn zip_code_database_population_of(ptr: *const ZipCodeDatabase, zip: *const c_char) -> uint32_t {
وإزالة كتل unsafe
بالداخل؟
يشير هذا إلى أن ptr
ربما يكون شيئًا غير قابل للتحقق - على سبيل المثال يمكنك حتى إعطاء شيء يشير إلى شيء آخر غير ZipCodeDatabase
(كائن / تخطيط ذاكرة مختلف تمامًا) وفي هذه الحالة يكون UB و هكذا وهكذا دواليك.
أقوم بترميز FFI بنفسي لذا أتجول فقط إذا كان هناك أي سبب معين لاختيار واحد على الآخر في هذا السيناريو.
سؤال جيد ! كان تفكيري حول حقيقة أن الكتل unsafe
توفر وثائق حول ما يجعلها "آمنة". وجهة نظرك حول تمرير النوع الخطأ عبر نوع المؤشر يؤدي إلى ثقب في ذلك (على الرغم من أنني لا أرى أي طريقة حوله).
يعد وضع علامة على الوظيفة بأكملها على أنها unsafe
أمرًا رائعًا من وجهة نظر التماثل - الوظائف _المستوردة_ من C هي بطبيعة الحال unsafe
. أتساءل أين يمكننا الحصول على المزيد من وجهات النظر للمساعدة في اتخاذ القرار ...
أنا من أجل تعليم الوظيفة بأكملها كـ unsafe
. إذا كان شيئًا يعتمد فيه الأمان على إدخال المستخدم ، فهو unsafe
. إن عدم تمييزه على أنه unsafe
يبدو وكأنه إعلان كاذب للمطور الذي يفكر في استخدامه. (هذا جزء من السبب ، في المشاريع الأخيرة التي تتطلب روابط FFI ، أكتب الروابط بلغة غير Rust وأدعم فقط استخدام مكتبة Rust من خلال هذه الارتباطات. تمتد "الوحدة الآمنة" ، في هذه الحالة ، عبر FFI الحدود.)
بعد المراجعة ، أعتقد أنه من الأصح وضع علامة على الوظيفة كـ unsafe
للإشارة إلى المتصلين أنهم مسؤولون عن ضمان السلامة. هناك RFC 2585 مقترح من شأنه أن يجعله بحيث لا يشير fn غير الآمن إلى كتلة غير آمنة ، مما يجعلني أكثر سعادة بشأن مثل هذا التغيير. في الوقت الحالي ، يمكن "تحديد نطاق" عدم الأمان إلى عدد قليل من السطور ، ولكن عند إنشاء الوظيفة unsafe
، فإن كتلة unsafe
الإضافية ستطلق تحذيرًا.
يمكننا أن نفترض أنه سيتم قبول RFC ومحاولة ترميز تلك المعايير اليوم من خلال تجاهل التحذير ، لكنه مسار هش.
التعليق الأكثر فائدة
بعد المراجعة ، أعتقد أنه من الأصح وضع علامة على الوظيفة كـ
unsafe
للإشارة إلى المتصلين أنهم مسؤولون عن ضمان السلامة. هناك RFC 2585 مقترح من شأنه أن يجعله بحيث لا يشير fn غير الآمن إلى كتلة غير آمنة ، مما يجعلني أكثر سعادة بشأن مثل هذا التغيير. في الوقت الحالي ، يمكن "تحديد نطاق" عدم الأمان إلى عدد قليل من السطور ، ولكن عند إنشاء الوظيفةunsafe
، فإن كتلةunsafe
الإضافية ستطلق تحذيرًا.يمكننا أن نفترض أنه سيتم قبول RFC ومحاولة ترميز تلك المعايير اليوم من خلال تجاهل التحذير ، لكنه مسار هش.