راست ۱.۹۸ مرز FFI را سختگیرانهتر میکند و برای بازههای اسلایس زبان دقیقتری میدهد
راست ۱.۹۸.۰ که در ۲۰ اوت منتشر شد، تشخیصهای تازهای برای نمادهای runtime و APIهای پایدارشدهای برای بیان بازههای رشته و اسلایس دارد. این تغییرات دو منبع رایج ابهام در کدنویسی سطح پایین را به رفتار قابل بررسی کامپایلر و کتابخانه تبدیل میکنند.

راست ۱.۹۸.۰ منتشر شده است و یکی از کاربردیترین محورهای آن، دقیقتر کردن کنترل مرزهاست. این نسخه lintهایی برای تعریف نمادهای runtime اضافه میکند و APIهایی را پایدار میسازد که بیان بازهها در رشتهها و اسلایسها را بدون بازسازی دستی offsetها سادهتر میکنند.
بخش مربوط به FFI از نظر امنیتی مهمتر است. راست ۱.۹۸ lint خطایابیِ پیشفرضِ انکارشده invalid_runtime_symbol_definitions و lint هشداردهنده suspicious_runtime_symbol_definitions را اضافه میکند. بررسی اولیه روی نمادهای runtime در core مانند memcmp، memset و strlen متمرکز است. برای پروژههایی که از linker سفارشی، targetهای embedded یا رابطهای سازگار با C استفاده میکنند، این یعنی برخورد ناخواسته با یک نماد runtime میتواند به خطای قابل مشاهده در build تبدیل شود، نه یک خطر خاموش در یکپارچهسازی.
اما یک محدودیت مهم وجود دارد. یادداشتهای انتشار میگویند این lintها فعلاً مجموعه مشخصی از نمادهای core را پوشش میدهند و قرار است در نسخههای بعدی گستردهتر شوند. بنابراین نباید آنها را تحلیل جامع FFI دانست؛ این قابلیتها فقط یک لایه ایمنی اولیه هستند. تیمها همچنان باید اعلانهای extern، تنظیمات linker، bindingهای تولیدشده و فرضهای runtime وابسته به پلتفرم را بازبینی کنند.
راست ۱.۹۸ همچنین lint هشداردهنده c_void_returns را اضافه میکند. این lint استفاده از core::ffi::c_void بهعنوان نوع بازگشتی را علامتگذاری میکند؛ الگویی که ممکن است یک ناهماهنگی ABI یا قراردادی ناقص در تابع خارجی را پنهان کند. این هشدار ثابت نمیکند که هر مورد اشتباه است، اما محل مناسبی برای بررسی کد مرزی C و راست در اختیار نگهدارندگان میگذارد.
در سمت کتابخانه، str::substr_range و [T]::subslice_range دسترسی مبتنی بر بازه را برای رشتهها و اسلایسها فراهم میکنند. بهجای ارسال یک بازه و سپس محاسبه جداگانه موقعیت آن، کد میتواند بازه متناظر را در مقدار اصلی درخواست کند. این قابلیت برای parserها، tokenizerها، پیامهای خطا و تبدیلهای zero-copy مفید است؛ جاهایی که حفظ offsetها به اندازه استخراج یک view اهمیت دارد.
این نسخه همچنین str::strip_circumfix و همتای آن برای اسلایس را پایدار میکند؛ یعنی حذف یک پیشوند و پسوند جفتشده بهشکل صریح انجام میشود. در parserهای پروتکل و پردازش متن ساختیافته، این API میتواند جایگزین بررسیهای تکراری دو سر مقدار شود و خوانایی عملیات را حفظ کند.
درس ارتقا روشن است: پیش از تغییر حداقل نسخه پشتیبانیشده، راست ۱.۹۸ را در CI اجرا کنید. lintهای تازه ممکن است اعلانهای FFI را آشکار کنند که به audit دستی نیاز دارند و APIهای بازه میتوانند کدی را که اکنون slicing را با محاسبه offset ترکیب میکند سادهتر کنند. یادداشتهای انتشار راست همچنین تغییرات سازگاری، از جمله سختگیری بیشتر در برخی layoutها، importها، بررسیهای transmute و کشف فایلهای rustfmt را مستند کردهاند. این تغییرات محدودند، اما کد تولیدشده و crateهای وابسته به پلتفرم باید آزمایش شوند، نه اینکه سازگار فرض شوند.
راست ۱.۹۸ بازطراحی کامل تعامل ناامن با کد خارجی نیست. تغییر آن کوچکتر اما مفیدتر است: کامپایلر نام یک دسته از خطاهای نمادهای runtime را آشکارتر میکند و کتابخانه استاندارد نیز زبان دقیقتری برای حفظ رابطه میان بازهها در اختیار کد سطح پایین میگذارد. برای توسعهدهندگان سیستم، نتیجه این است که کد مرزی پیش از رسیدن به production آسانتر بررسی میشود.
خبرخوان را در ایمیل بگیرید
هر سیگنال تازه، مستقیم از خط تولید. بدون مزاحمت، لغو عضویت در هر زمان.


