mcheck(3)

الاسم
mcheck, mcheck_check_all, mcheck_pedantic, mprobe - التحقق من اتساق الكومة

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

موجز
#include <mcheck.h>

int mcheck(typeof(void (enum mcheck_status mstatus)) *f);
int mcheck_pedantic(
           typeof(void (enum mcheck_status mstatus)) *f);
void mcheck_check_all(void);

enum mcheck_status mprobe(void *ptr);

الوصف
تثبّت الدالة mcheck() مجموعة من خطافات التصحيح لعائلة دوال تخصيص الذاكرة malloc(3). تتسبب هذه الخطافات في إجراء فحوصات اتساق معينة على حالة الكومة. يمكن للفحوصات اكتشاف أخطاء التطبيق مثل تحرير كتلة ذاكرة أكثر من مرة أو إفساد هياكل بيانات المحاسبة التي تسبق كتلة الذاكرة المخصصة مباشرة.

لكي تكون فعالة، يجب استدعاء الدالة mcheck() قبل أول استدعاء لـ malloc(3) أو دالة ذات صلة. في الحالات التي يصعب فيها ضمان ذلك، يُدرج ربط البرنامج بـ -lmcheck استدعاءً ضمنيًا لـ mcheck() (بوسيطة NULL) قبل أول استدعاء لدالة تخصيص ذاكرة.

الدالة mcheck_pedantic() مشابهة لـ mcheck()، ولكنها تجري فحوصات على جميع الكتل المخصصة كلما تم استدعاء إحدى دوال تخصيص الذاكرة. قد يكون هذا بطيئًا جدًا!

تتسبب الدالة mcheck_check_all() في إجراء فحص فوري على جميع الكتل المخصصة. يكون هذا الاستدعاء فعالاً فقط إذا تم استدعاء mcheck() مسبقًا.

إذا اكتشف النظام عدم اتساق في الكومة، تُستدعى الدالة المقدمة من المتصل المشار إليها بـ f مع وسيطة واحدة، mstatus، تشير إلى نوع عدم الاتساق الذي تم اكتشافه. إذا كانت f NULL، تطبع دالة مبدئية رسالة خطأ على stderr وتستدعي abort(3).

تجري الدالة mprobe() فحص اتساق على كتلة الذاكرة المخصصة المشار إليها بـ ptr. يجب استدعاء الدالة mcheck() مسبقًا (وإلا تُرجع mprobe() MCHECK_DISABLED).

تصف القائمة التالية القيم التي تُرجعها mprobe() أو التي تُمرر كوسيطة mstatus عند استدعاء f:

MCHECK_DISABLED (mprobe() فقط)
    لم تُستدع mcheck() قبل استدعاء أول دالة تخصيص ذاكرة. فحص الاتساق غير ممكن.

MCHECK_OK (mprobe() فقط)
    لم يُكتشف أي عدم اتساق.

MCHECK_HEAD
    تم إتلاف الذاكرة السابقة لكتلة مخصصة.

MCHECK_TAIL
    تم إتلاف الذاكرة التالية لكتلة مخصصة.

MCHECK_FREE
    تم تحرير كتلة ذاكرة مرتين.

قيمة الإرجاع
تُعيد mcheck() و mcheck_pedantic() القيمة 0 عند النجاح، أو -1 عند الخطأ.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
mcheck(), mcheck_pedantic(), mcheck_check_all(), mprobe() | سلامة الخيوط | MT-Unsafe race:mcheck const:malloc_hooks

المعايير
GNU.

التاريخ

mcheck_pedantic()
mcheck_check_all()
    glibc 2.2.

mcheck()
mprobe()
    glibc 2.0.

ملاحظات
يُسبب وصل برنامج مع -lmcheck واستخدام متغير البيئة MALLOC_CHECK_ (الموصوف في mallopt(3)) كشف نفس أنواع الأخطاء. لكن، استخدام MALLOC_CHECK_ لا يتطلب إعادة وصل التطبيق.

أمثلة
يستدعي البرنامج أدناه mcheck() مع وسيط NULL ثم يُحرر نفس كتلة الذاكرة مرتين. تُظهر جلسة الصدفة التالية ما يحدث عند تشغيل البرنامج:

    $ ./a.out
    About to free

    About to free a second time
    block freed twice
    Aborted (core dumped)

  مصدر البرنامج
    #include <mcheck.h>
    #include <stdio.h>
    #include <stdlib.h>

    int
    main(void)
    {
        char *p;

        if (mcheck(NULL) != 0) {
            fprintf(stderr, "mcheck() failed\n");

            exit(EXIT_FAILURE);
        }

        p = malloc(1000);

        fprintf(stderr, "About to free\n");
        free(p);
        fprintf(stderr, "\nAbout to free a second time\n");
        free(p);

        exit(EXIT_SUCCESS);
    }

انظر أيضًا
malloc(3)، mallopt(3)، mtrace(3)

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

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

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