لینوکس بعد از شش سال، بالاخره strncpy رو حذف کرد
خلاصهٔ کاملتر
بر اساس گزارش Phoronix، کرنل لینوکس تو نسخه ۷.۲ بالاخره تابع strncpy رو کامل از کدش حذف کرد. این تابع که برای کپی کردن تعداد مشخصی بایت بهکار میرفت، مدتها بود که deprecated (منسوخ) شده بود، و حالا بعد از شش سال کار و صدها پچ، دیگه هیچ استفادهکنندهای ازش تو کرنل باقی نمونده که کاملاً برداشته بشه.
نویسنده میگه strncpy سالها یه «منبع همیشگی باگ» بوده. دلیلش هم دوتا چیزه: اول رفتار غیرشهودی و گیجکنندهش سر NUL termination (یعنی اینکه رشتهٔ خروجی رو با کاراکتر پایان صفر میبنده یا نه)، و دوم مشکلات کارایی که از صفرپُر کردن بیشازحد و اضافیِ مقصد میاومد.
برداشتن این تابع کار کمی نبود. به گفتهٔ گزارش، حدود ۳۶۲ کامیت طول کشید تا همهٔ جاهایی که تو کرنل از strncpy استفاده میکردن پاکسازی بشه. یه merge روز جمعه، هم خود API و هم آخرین پیادهسازیهای اختصاصی strncpy برای هر معماری CPU رو حذف کرد و اینجوری کار به خط پایان رسید.
توسعهدهندهها بهجای strncpy باید بسته به شرایط سراغ جایگزینها برن: strscpy برای مقصدهایی که NUL termination میخوان، strscpy_pad برای همون حالت ولی با صفرپُر کردن، strtomem_pad برای فیلدهای عرضثابتِ بدون NUL، memcpy_and_pad برای کپیهای محدود با padding مشخص، و در نهایت memcpy برای کپی حافظه با طول معلوم.
نکات کلیدی:
- کرنل لینوکس ۷.۲ تابع strncpy رو کامل حذف کرد.
- این تابع بهخاطر رفتار گیجکننده سر NUL termination و صفرپُر کردن اضافی، منبع همیشگی باگ بود.
- حذفش شش سال و حدود ۳۶۲ کامیت طول کشید.
- جایگزینها بسته به نیاز عبارتن از strscpy، strscpy_pad، strtomem_pad، memcpy_and_pad و memcpy.




