You are on page 1of 6

Secure coding

HEAP
RESERVAT
ION
RPB TEAM
RA'AD ABU JAISH
‫‪Heap Reservation malloc‬‬

‫الدالة ‪ malloc‬هي دالة في لغة البرمجة ‪ C‬وتستخدم لحجز مساحة في الذاكرة‪ .‬تأخذ‬
‫الدالة معامل واحد فقط وهو حجم المساحة التي ترغب في حجزها بالبايت‪.‬‬


‫تقوم الدالة ‪ malloc‬بحجز مساحة متتالية في الذاكرة بحجم يعادل المعامل الذي تم‬
‫تمريره إليها‪ ،‬وتقوم بإرجاع عنوان الذاكرة األولى في هذه المساحة المحجوزة‪.‬‬


‫ومن الجدير بالذكر أن الذاكرة التي تم حجزها باستخدام ‪ malloc‬ليست مهيأة بقيمة‬
‫معينة‪ .‬وبالتالي‪ ،‬قد تحتوي على بيانات عشوائية قد تكون تركتها عمليات سابقة في‬
‫الذاكرة‪ .‬لذلك‪ ،‬قبل استخدام الذاكرة المحجوزة‪ ،‬يجب تهيئتها بالقيم المناسبة‪.‬‬


‫على سبيل المثال‪ ،‬إذا كنت ترغب في حجز مساحة تخزين بحجم ‪ 10‬بايت‪ ،‬يمكنك استخدام‬
‫الدالة ‪ malloc‬على النحو التالي‪:‬‬

‫‪RPB - TEAM‬‬

‫;))‪int* numbers = (int*) malloc(10 * sizeof(int‬‬


‫‪@RA'AD ABU JAISH‬‬

‫في هذا المثال‪ ،‬يتم حجز مساحة في الذاكرة تكفي لتخزين ‪ 10‬أعداد صحيحة‪ .‬يتم‬
‫تحويل العنوان ال ُم ر َج ع من ِق َب ل ‪ malloc‬إلى عنوان من نوع ‪ int‬باستخدام عبارة‬
‫(‪ )*int‬لتوضيح نوع البيانات ال ُم خ ّز نة في الذاكرة‪.‬‬

‫بعد االستخدام الكامل للذاكرة المحجوزة‪ ،‬يجب تحريرها باستخدام الدالة ‪ free‬على‬
‫النحو التالي‪:‬‬


‫‪RPB - TEAM‬‬

‫;)‪free(numbers‬‬
‫‪@RA'AD ABU JAISH‬‬

‫هذا ُي حّر ر المساحة في الذاكرة ويجعلها متاحة للحجز مرة أخرى الحًق ا في البرنامج‪ .‬من‬
‫المهم التأكد من تحرير الذاكرة المحجوزة باستخدام ‪ free‬عندما لم تعد هناك حاجة‬
‫الستخدامها لتجنب تسريب الذاكرة المحجوزة‬

‫‪RPB -TEAM‬‬
‫‪RA'AD ABU JAISH‬‬
‫‪Heap Reservation calloc‬‬

‫الدالة ‪ calloc‬هي دالة في لغة البرمجة ‪ C‬تستخدم لحجز مساحة في الذاكرة وتهيئتها بقيمة‬
‫صفر‪ .‬تأخذ الدالة معاملين‪ nmemb :‬و ‪ ،size‬حيث ‪ nmemb‬يحدد عدد العناصر التي ترغب في حجز‬
‫مساحة لها‪ ،‬و ‪ size‬يحدد حجم كل عنصر بالبايت‪.‬‬


‫تقوم الدالة ‪ calloc‬بحجز مساحة متتالية في الذاكرة بحجم يعادل حاصل ضرب ‪ nmemb‬و ‪.size‬‬
‫وتقوم بتهيئة جميع البايتات في هذه المساحة المحجوزة بالقيمة صفر‪.‬‬


‫ثم تقوم بإرجاع عنوان الذاكرة األولى في هذه المساحة المحجوزة‪.‬‬


‫على سبيل المثال‪ ،‬إذا كنت ترغب في حجز مساحة تخزين لـ ‪ 5‬أعداد صحيحة‪ ،‬حيث يكون حجم كل‬
‫عدد صحيح ‪ 4‬بايت‪ ،‬يمكنك استخدام الدالة ‪ calloc‬على النحو التالي‪:‬‬

‫‪RPB - TEAM‬‬

‫;))‪int* numbers = (int*) calloc(5, sizeof(int‬‬


‫‪@RA'AD ABU JAISH‬‬

‫في هذا المثال‪ ،‬تتم حجز مساحة في الذاكرة تكفي لتخزين ‪ 5‬أعداد صحيحة‪ ،‬وتهيئة‬
‫جميع البايتات في هذه المساحة بقيمة صفر‪ .‬يتم تحويل العنوان الُم رَج ع من ِق َب ل ‪calloc‬‬
‫إلى عنوان من النوع ‪ int‬باستخدام عبارة (‪ )*int‬لتوضيح نوع البيانات المخزنة في الذاكرة‪.‬‬


‫بعد االنتهاء من استخدام المساحة المحجوزة‪ ،‬يجب تحريرها باستخدام الدالة ‪ free‬كما‬
‫في الدالة ‪:malloc‬‬

‫‪RPB - TEAM‬‬

‫;)‪free(numbers‬‬
‫‪@RA'AD ABU JAISH‬‬

‫هذا يقوم بتحرير المساحة في الذاكرة وجعلها متاحة للحجز مرة أخرى في وقت الحق في‬
‫البرنامج‪.‬‬


‫‪RPB -TEAM‬‬ ‫

‫‪RA'AD ABU JAISH‬‬ ‫

‫‪Heap Reservation malloc and calloc‬‬

‫الفرق الرئيسي بين ‪ malloc‬و ‪ calloc‬هو فيما يتعلق بتهيئة الذاكرة المحجوزة‪ .‬إليك‬
‫الفروق الرئيسية بينهما‪:‬‬


‫‪-1‬قيمة البايتات الُم هيأة‪:‬‬


‫‪ :malloc‬ال يقوم بتهيئة البايتات بقيمة معينة‪ .‬يتم ترك البايتات غير مهيأة‪ ،‬مما يعني‬
‫أنها قد تحتوي على بيانات عشوائية‪.‬‬
‫‪ :calloc‬يقوم بتهيئة جميع البايتات بقيمة صفر‪ .‬يضمن أن جميع البتات في المساحة‬
‫المحجوزة تكون صفر‪ ،‬بمعنى أنها تحتوي على قيمة افتراضية صفر‪.‬‬

‫‪-2‬المعامالت المستخدمة‪:‬‬


‫‪ :malloc‬تأخذ معامل واحد وهو حجم المساحة المطلوبة بالبايت‪.‬‬
‫‪ :calloc‬تأخذ معاملين‪ ،‬األول هو عدد العناصر التي ترغب في حجزها والثاني هو حجم‬
‫كل عنصر بالبايت‪.‬‬

‫‪-3‬األداء‪:‬‬


‫‪ :malloc‬يكون أداءه أسرع من ‪ calloc‬ألنه ال يقوم بتهيئة البايتات‪ .‬إذا كنت ال تحتاج إلى‬
‫تهيئة البايتات بقيمة صفر‪ ،‬فقد تفضل استخدام ‪ malloc‬ألداء أسرع‪.‬‬
‫‪ :calloc‬يكون أداءه أبطأ من ‪ malloc‬بسبب الخطوة اإلضافية لتهيئة البايتات بقيمة‬
‫صفر‪ .‬ومع ذلك‪ ،‬في بعض الحاالت‪ ،‬قد تكون تهيئة الذاكرة بقيمة صفر ضرورية‪،‬‬
‫وبالتالي فإن ‪ calloc‬يوفر هذه الميزة‪.‬‬

‫‪RPB -TEAM‬‬
‫‪RA'AD ABU JAISH‬‬
‫‪Heap Reservation free‬‬

‫تعتبر الدالة ‪ )free(void *ptr‬وظيفتها إطالق الذاكرة المخصصة سابًق ا‪ .‬وتستخدم هذه‬
‫الدالة إلرجاع الذاكرة التي تم تخصيصها باستخدام دالة تخصيص الذاكرة‪.‬‬


‫تأخذ الدالة ‪ free‬مؤشًر ا ‪ void *ptr‬كمدخل‪ ،‬وهذا المؤشر يشير إلى البداية األولية‬
‫للمساحة في الذاكرة التي تم تخصيصها سابًق ا‪ .‬عند تنفيذ الدالة ‪ ،free‬يقوم النظام بإلغاء‬
‫تخصيص الذاكرة وإطالقها لإلعادة استخدامها في وقت الحق‪.‬‬


‫من المهم أن يتم تحديد مؤشر صالح الستخدام الدالة ‪ .free‬يجب أن يكون المؤشر الممرر‬
‫إلى الدالة ‪ free‬قد تم الحصول عليه باستخدام دالة تخصيص الذاكرة‪ ،‬مثل ‪ malloc‬أو ‪calloc‬‬
‫أو ‪ ،realloc‬وأال يكون المؤشر قد تم تحريره مسبًق ا‪.‬‬


‫بعد تنفيذ الدالة ‪ ،free‬يعتبر البيانات الموجودة في تلك المساحة في الذاكرة غير صالحة‬
‫وتعتبر "قمامة"‪ ،‬ويمكن إعادة استخدامها في أي وقت من قبل النظام‪.‬‬


‫مثال على استخدام الدالة ‪:free‬‬

‫‪RPB - TEAM‬‬

‫تخصيص ذاكرة لمتغير ‪int *ptr = malloc(sizeof(int)); //‬‬


‫‪ int‬من نوع‬
‫‪ //‬استخدام المتغير ‪ptr‬‬
‫إلغاء تخصيص الذاكرة وإطالقها ‪free(ptr); //‬‬
‫‪ //‬اآلن يمكن إعادة استخدام المساحة التي تم تحريرها‬
‫‪@RA'AD ABU JAISH‬‬

‫تحذير‪ :‬بعد استخدام الدالة ‪ ،free‬يجب عدم الوصول إلى المساحة التي تمت إزالتها‬
‫بواسطتها‪ ،‬حيث يمكن أن تؤدي محاولة الوصول إلى سلوك غير محدد‪ ،‬مثل الوصول إلى‬
‫بيانات غير صالحة أو حدوث تعارض في الذاكرة‪.‬‬




‫‪RPB -TEAM‬‬
‫‪RA'AD ABU JAISH‬‬
‫‪Heap Reservation realloc‬‬ ‫‪RPB -TEAM‬‬

‫دالة ‪ )realloc(void *ptr, size_t size‬هي دالة ُت ستخدم لتغيير حجم مساحة الذاكرة التي تم‬
‫تخصيصها مسبًق ا والتي يشير إليها المؤشر الذي يتم تمريره كمعامل أول‪ .‬يتم تحديد الحجم‬
‫الجديد لهذه المساحة باستخدام المعامل الثاني الذي ُي مرر للدالة‪ُ .‬ت رجع الدالة عنوان الذاكرة‬
‫الجديدة بعد تغيير الحجم‪ ،‬وال يكون هذا العنوان بالضرورة مماثاًل للعنوان األصلي الذي تم‬
‫تمريره كمعامل‪.‬‬


‫عند استخدام الدالة ‪ ،realloc‬يجب أن يتم تمرير مؤشر صحيح وصالح للذاكرة كقيمة المعامل‬
‫األول ‪ُ .ptr‬ي شير هذا المؤشر إلى بداية المساحة التي تم تخصيصها مسبًق ا‪ .‬قيمة المعامل‬
‫الثاني ‪ُ size‬ت حدد الحجم الجديد الذي يجب تخصيصه للذاكرة‪.‬‬


‫عند تنفيذ الدالة ‪ ،realloc‬يتم تغيير حجم المساحة المخصصة وإعادة تخصيصها‪ .‬إذا كان هناك‬
‫مساحة كافية بعد المساحة المحجوزة الحالية‪ ،‬فقد يتم توسيع المساحة في نفس الموقع‪.‬‬
‫وإذا كان هناك قلة في المساحة المحجوزة الحالية‪ ،‬فقد يتم نقل المحتوى إلى مساحة جديدة‬
‫تم تخصيصها وتكون ذاكرة العناصر القديمة قد تم حرقها وتجاهلها‪.‬‬


‫ما يجب أن تعلمه هو أن البيانات الموجودة في المساحة التي لم يتم تعديلها ُت حافظ عليها‬
‫وال يتم تغييرها‪ .‬يتم االحتفاظ بعدد البايتات غير المعدلة بواسطة الحجم الفعلي والحجم‬
‫الجديد‪ ،‬وذلك لضمان عدم فقدان أو تغيير البيانات المهمة‪.‬‬


‫‪RPB - TEAM‬‬


‫>‪#include <stdio.h‬‬
‫>‪#include <stdlib.h‬‬
‫{ )(‪int main‬‬
‫‪ //‬تخصيص مساحة ذاكرة لحفظ مصفوفة من األعداد الصحيحة‬
‫;))‪int *numbers = (int *)malloc(5 * sizeof(int‬‬
‫‪ int‬تم تخصيص مساحة ذاكرة لـ ‪ 5‬عناصر من نوع ‪//‬‬
‫‪ //‬يمكننا القيام بالعمليات المطلوبة هنا‬
‫‪ //‬تحجيم المساحة إىل ‪ 10‬عناصر من نوع ‪int‬‬
‫;))‪numbers = (int *)realloc(numbers, 10 * sizeof(int‬‬
‫‪ int‬تم تغيير حجم المساحة المخصصة إىل ‪ 10‬عناصر من نوع ‪//‬‬
‫يمكننا القيام بالعمليات المطلوبة هنا ‪//‬‬
‫اآلن يمكننا الوصول إىل المساحة الجديدة المحجوزة بعد التحجيم ‪//‬‬
‫إلغاء تخصيص الذاكرة بعد االنتهاء من االستخدام ‪//‬‬
‫;)‪free(numbers‬‬
‫} ;‪return 0‬‬
‫‪@RA'AD ABU JAISH‬‬

‫‪RA'AD ABU JAISH‬‬

You might also like