bzero(3)

الاسم
bzero, explicit_bzero - تصفير سلسلة بايتات

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <strings.h>

void bzero(size_t n;
           void s[n], size_t n);

#include <string.h>

void explicit_bzero(size_t n;
           void s[n], size_t n);

الوصف
الدالة bzero() تمسح البيانات في n بايت من الذاكرة ابتداءً من الموقع المشار إليه بـ s، بكتابة أصفار (بايتات تحتوي على '\0') إلى تلك المنطقة.

الدالة explicit_bzero() تؤدي نفس مهمة bzero(). تختلف عن bzero() في أنها تضمن ألا تزيل تحسينات المترجم عملية المسح إذا استنتج المترجم أن العملية "غير ضرورية".

قيمة الإرجاع
لا شيء.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
bzero(), explicit_bzero() | سلامة الخيوط | MT-Safe

المعايير
لا شيء.

التاريخ

explicit_bzero()
    glibc 2.25.

    الدالة explicit_bzero() هي امتداد غير قياسي موجود أيضًا في بعض أنظمة BSD. بعض التطبيقات الأخرى لديها دالة مشابهة، مثل memset_explicit() أو memset_s().

bzero()
    4.3BSD.

    وُسمت كـ LEGACY في POSIX.1-2001. أُزيلت في POSIX.1-2008.

ملاحظات
الدالة explicit_bzero() تعالج مشكلة قد تواجهها التطبيقات الحساسة أمنيًا عند استخدام bzero(): إذا استطاع المترجم استنتاج أن الموقع المراد تصفيره لن يُلمس مرة أخرى بواسطة برنامج صحيح، فقد يزيل استدعاء bzero() بالكامل. هذه مشكلة إذا كان القصد من استدعاء bzero() هو مسح بيانات حساسة (مثل كلمات السر) لمنع احتمال تسرب البيانات بواسطة برنامج غير صحيح أو مخترق. استدعاءات explicit_bzero() لا تُحسّن أبدًا بعيدًا بواسطة المترجم.

الدالة explicit_bzero() لا تحل جميع المشاكل المرتبطة بمسح البيانات الحساسة:

•   الدالة explicit_bzero() لا تضمن أن البيانات الحساسة مُسحت بالكامل من الذاكرة. (نفس الشيء ينطبق على bzero().) على سبيل المثال، قد تكون هناك نسخ من البيانات الحساسة في مسجل وفي مناطق "خردة" في المكدس. الدالة explicit_bzero() لا تعلم بهذه النسخ، ولا تستطيع مسحها.

•   في بعض الظروف، explicit_bzero() يمكن أن تقلل الأمان. إذا قرر المترجم أن المتغير الذي يحتوي على البيانات الحساسة يمكن تحسينه ليُخزن في مسجل (لأنه صغير بما يكفي ليتسع في مسجل، ولا عملية غير استدعاء explicit_bzero() تحتاج لأخذ عنوان المتغير)، فإن استدعاء explicit_bzero() سيجبر البيانات على أن تُنسخ من المسجل إلى موقع في RAM ثم تُمسح فورًا (بينما تبقى النسخة في المسجل غير متأثرة). المشكلة هنا هي أن البيانات في RAM أكثر عرضة للكشف بواسطة خطأ من البيانات في مسجل، وبالتالي استدعاء explicit_bzero() يخلق نافذة زمنية قصيرة حيث تكون البيانات الحساسة أكثر ضعفًا مما كانت عليه لو لم تُبذل محاولة لمسح البيانات.

لاحظ أن تعريف المتغير الحساس بمؤهل volatile لا يزيل المشاكل المذكورة أعلاه. في الواقع، سيجعلها أسوأ، لأنه، على سبيل المثال، قد يجبر متغيرًا كان سيُحسّن إلى مسجل بدلاً من ذلك على أن يُحتفظ به في RAM (أكثر ضعفًا) طوال عمره.

على الرغم من التفاصيل المذكورة أعلاه، للتطبيقات الحساسة أمنيًا، استخدام explicit_bzero() أفضل عمومًا من عدم استخدامها. مطورو explicit_bzero() يتوقعون أن المترجمات المستقبلية ستتعرف على استدعاءات explicit_bzero() وتتخذ خطوات لضمان مسح جميع نسخ البيانات الحساسة، بما في ذلك النسخ في المسجلات أو في مناطق "خردة" المكدس.

انظر أيضًا
bstring(3), memset(3), swab(3)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.