EN
→ بازگشت به خبرخوان
شمارهٔ ۰۲۹۲Rust۲ دقیقه۵ منبع

Rust 1.98 بررسی نمادهای runtime قابل‌جایگزینی در FFI را آغاز می‌کند

Rust 1.98 برای نمادهای نادرست runtime در core و استفاده نادرست از c_void در جایگاه مقدار بازگشتی، هشدارهای کامپایلری اضافه می‌کند؛ سیگنالی زودتر برای پروژه‌های سطح پایین و FFIمحور.

اشتراک‌گذاری
راست (Rust)
Rust 1.98 بررسی نمادهای runtime قابل‌جایگزینی در FFI را آغاز می‌کند
تصویر: تولید هوش مصنوعی

نسخه Rust 1.98.0 که در ۲۰ اوت منتشر شد، یک لایه حفاظتی کوچک اما مهم برای Rust سطح پایین اضافه می‌کند: کامپایلر اکنون اعلان‌هایی را که از نام‌های رزروشده برای نمادهای runtime در core استفاده می‌کنند بررسی می‌کند و همچنین وقتی core::ffi::c_void به‌عنوان نوع بازگشتی به کار رود، هشدار می‌دهد.

تغییر مربوط به نمادهای runtime برای crateهایی مهم‌تر است که توابع سطح پایینی مانند memcmp، memset و strlen را تعریف، جایگزین یا عرضه می‌کنند. Rust 1.98 lintی با نام invalid_runtime_symbol_definitions اضافه کرده است که در حالت پیش‌فرض سطح deny دارد؛ این lint زمانی فعال می‌شود که نماد منطبق، امضایی به‌طور معنادار نادرست داشته باشد—برای نمونه ناسازگاری ABI یا توابع variadic، تعداد نادرست آرگومان‌ها یا نبودن نوع بازگشتی. lint جداگانه suspicious_runtime_symbol_definitions نیز درباره امضاهایی که نیازمند بررسی‌اند هشدار می‌دهد. این بررسی‌ها فرضی شکننده در سطح linker و ABI را به نقطه‌ای قابل مشاهده برای کامپایلر و code review تبدیل می‌کنند.

این انتشار همچنین lint هشداردهنده c_void_returns را به‌صورت پیش‌فرض فعال می‌کند. c_void در Rust، وقتی از طریق pointer مانند *mut c_void استفاده شود، معادل void در C برای اشاره‌گرهاست؛ اما شکل نوشتاری تابع C که void برمی‌گرداند نیست. چنین تابعی باید در Rust مقدار () برگرداند یا نوع بازگشتی آن حذف شود. مستندات کتابخانه استاندارد این تفاوت را صریح بیان می‌کنند و مستندات lint هشدار می‌دهند که اعلان یک تابع extern با c_void به‌عنوان نوع بازگشتی، هنگام فراخوانی می‌تواند به رفتار تعریف‌نشده منجر شود.

برای سازندگان bindingهای FFI، کد embedded، allocatorها، runtimeها یا crateهای سیستمی نزدیک به WebAssembly، واکنش عملی روشن است: پروژه را با Rust 1.98 کامپایل کنید، diagnosticهای جدید را بررسی کنید و آن‌ها را به‌صورت سراسری خاموش نکنید. در bindingهای تولیدشده، generator یا منبع اعلان خارجی را اصلاح کنید، نه اینکه یک allow گسترده اضافه کنید. در بلوک‌های دستی extern، هدر C، قرارداد فراخوانی، variadic بودن، تعداد آرگومان‌ها و نوع بازگشتی را در کنار هم بررسی کنید.

این تغییر یک مرز تشخیصی است، نه تأییدکننده کامل FFI. این lintها ثابت نمی‌کنند که همه اعلان‌های خارجی از نظر ABI درست هستند. همچنین release notes می‌گوید بررسی نمادهای runtime فعلاً عمدتاً نمادهای core مانند memcmp، memset و strlen را هدف می‌گیرد و Rust قصد دارد پوشش آن را در نسخه‌های آینده گسترش دهد. بنابراین محدودیت فعلی باید در نظر گرفته شود: build موفق شواهد مفیدی است، اما جایگزین تولید binding بر اساس هدر، آزمون روی پلتفرم‌های هدف یا بررسی ABI نمی‌شود.

تغییر بزرگ‌تر این است که Rust محل کشف خطا را جابه‌جا می‌کند. پیش‌تر این اشتباه‌ها ممکن بود در bindingهای تولیدشده پنهان بمانند یا فقط هنگام link شدن یا اجرای برنامه آشکار شوند. Rust 1.98 دو دسته ناسازگاری سطح پایین—امضای نمادهای runtime و مقدار بازگشتی c_void—را به مرحله کامپایل معمولی نزدیک‌تر می‌کند؛ جایی که CI می‌تواند آن‌ها را پیش از رسیدن binary به production بررسی و رد کند.

برچسب‌هاRustRust 1.98FFICompiler Lints
منابع مستند۵ مرجع
  1. [۰۱]Announcing Rust 1.98.0blog.rust-lang.org
  2. [۰۲]Rust Release Notes — Version 1.98.0doc.rust-lang.org
  3. [۰۳]c_void in std::ffidoc.rust-lang.org
  4. [۰۴]rustc_lint::runtime_symbolsdoc.rust-lang.org
  5. [۰۵]rustc_lint::c_void_returnsdoc.rust-lang.org
خواندنی بعدی

خبرخوان را در ایمیل بگیرید

هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.

خوراک RSS در دسترس · بدون هرزنامه