.\" -*- coding: UTF-8 -*- .\" Copyright 2006, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH feature_test_macros 7 "10 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم feature_test_macros \- وحدات ماكرو اختبار الميزات .SH الوصف تسمح وحدات ماكرو اختبار الميزات للمبرمج بالتحكم في التعريفات التي تُعرض بواسطة ملفات رأس النظام عند ترجمة برنامج. .P \fBملاحظة:\fP لكي تكون فعالة، يجب تعريف ماكرو اختبار الميزات \fIقبل تضمين أي ملفات رأس\fP. يمكن القيام بذلك إما في أمر الترجمة (\fIcc \-DMACRO=value\fP) أو عن طريق تعريف الماكرو داخل الكود المصدري قبل تضمين أي رؤوس. يوجد شرط تعريف الماكرو قبل تضمين أي ملف رأس لأن ملفات الرأس قد تتضمن بعضها البعض بحرية. وهكذا، على سبيل المثال، في الأسطر التالية، قد لا يكون لتعريف ماكرو \fB_GNU_SOURCE\fP أي تأثير لأن الرأس \fI\fP نفسه يتضمن \fI\fP (يسمح POSIX بذلك صراحة): .P .in +4n .EX #include #define _GNU_SOURCE #include .EE .in .P بعض وحدات ماكرو اختبار الميزات مفيدة لإنشاء تطبيقات محمولة، عن طريق منع عرض التعريفات غير القياسية. يمكن استخدام وحدات ماكرو أخرى لعرض تعريفات غير قياسية لا تُعرض افتراضيًا. .P يمكن تحديد التأثيرات الدقيقة لكل من وحدات ماكرو اختبار الميزات الموصوفة أدناه من خلال فحص ملف الرأس \fI\fP. \fBملاحظة\fP: التطبيقات \fIلا\fP تحتاج إلى تضمين \fI\fP مباشرة؛ بل إن القيام بذلك غير مستحسن بشدة. انظر الملاحظات. .SS "تحديد متطلبات ماكرو اختبار الميزات في صفحات الدليل" عندما تتطلب دالة تعريف ماكرو اختبار ميزات، تتضمن صفحة الدليل SYNOPSIS عادةً ملاحظة بالشكل التالي (هذا المثال من صفحة دليل \fBacct\fP(2)): .P .RS \fB#include \fP .P \fBint acct(const char *\fP\fIfilename\fP\fB);\fP .P .RS -4 .EX متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .EE .RE .P \fBacct\fP(): _BSD_SOURCE || (_XOPEN_SOURCE && _XOPEN_SOURCE < 500) .RE .P يعني \fB||\fP أنه للحصول على تعريف \fBacct\fP(2) من \fI\fP، يجب تعريف \fIأحد\fP تعريفات الماكرو التالية قبل تضمين أي ملفات رأس: .P .in +4n .EX #define _BSD_SOURCE #define _XOPEN_SOURCE /* or any value < 500 */ .EE .in .P بدلاً من ذلك، يمكن تضمين تعريفات مكافئة في أمر الترجمة: .P .in +4n .EX cc \-D_BSD_SOURCE cc \-D_XOPEN_SOURCE # Or any value < 500 .EE .in .P لاحظ أنه، كما هو موضح أدناه، \fBيتم تعريف بعض وحدات ماكرو اختبار الميزات افتراضيًا\fP، بحيث قد لا يكون من الضروري دائمًا تحديد وحدات ماكرو اختبار الميزات المعروضة في SYNOPSIS صراحة. .P في حالات قليلة، تستخدم صفحات الدليل اختصارًا للتعبير عن متطلبات ماكرو اختبار الميزات (هذا المثال من \fBreadahead\fP(2)): .P .RS +4 .EX \fB#define _GNU_SOURCE\fP \fB#define _FILE_OFFSET_BITS 64\fP \fB#include \fP .P \fBssize_t readahead(int \fP\fIfd\fP\fB, off_t *\fP\fIoffset\fP\fB, size_t \fP\fIcount\fP\fB);\fP .EE .RE .P يُستخدم هذا التنسيق عندما تضمن وحدات ماكرو اختبار الميزات ظهور تعريفات الدوال الصحيحة، ولا يتم تعريف وحدات الماكرو افتراضيًا. .SS "وحدات ماكرو اختبار الميزات التي تفهمها glibc" تشرح الفقرات أدناه كيفية معالجة وحدات ماكرو اختبار الميزات في glibc 2.\fIx\fP، \fIx\fP > 0. .P أولاً، مع ذلك، ملخص لبعض التفاصيل لغير الصبورين: .IP \[bu] 3 الماكروات التي تحتاج غالبًا لاستخدامها في الشيفرة المصدرية الحديثة هي \fB_POSIX_C_SOURCE\fP (للتعريفات من إصدارات مختلفة من POSIX.1)، و\fB_XOPEN_SOURCE\fP (للتعريفات من إصدارات مختلفة من SUS)، و\fB_GNU_SOURCE\fP (لأمور GNU و/أو لينكس الخاصة)، و\fB_DEFAULT_SOURCE\fP (للحصول على تعريفات تُقدم عادةً بشكل مبدئي). .IP \[bu] تُعرف بعض الماكروات بقيم مبدئية. لذا، على الرغم من أن ماكروًا واحدًا أو أكثر قد يُشار إليه كمطلوب في SYNOPSIS لصفحة دليل، فقد لا يكون من الضروري تعريفها صراحةً. تُعطى التفاصيل الكاملة للمبدئيات لاحقًا في صفحة الدليل هذه. .IP \[bu] تعريف \fB_XOPEN_SOURCE\fP بقيمة 600 أو أكبر يُنتج نفس التأثيرات كتعريف \fB_POSIX_C_SOURCE\fP بقيمة 200112L أو أكبر. حيث يُرى .IP .in +4n .EX _POSIX_C_SOURCE >= 200112L .EE .in .IP في متطلبات ماكرو اختبار الميزات في SYNOPSIS لصفحة دليل، يُفهم ضمنيًا أن التالي له نفس التأثير: .IP .in +4n .EX _XOPEN_SOURCE >= 600 .EE .in .IP \[bu] تعريف \fB_XOPEN_SOURCE\fP بقيمة 700 أو أكبر يُنتج نفس التأثيرات كتعريف \fB_POSIX_C_SOURCE\fP بقيمة 200809L أو أكبر. حيث يُرى .IP .in +4n .EX _POSIX_C_SOURCE >= 200809L .EE .in .IP في متطلبات ماكرو اختبار الميزات في SYNOPSIS لصفحة دليل، يُفهم ضمنيًا أن التالي له نفس التأثير: .IP .in +4n .EX _XOPEN_SOURCE >= 700 .EE .in .\" The details in glibc 2.0 are simpler, but combining a .\" a description of them with the details in later glibc versions .\" would make for a complicated description. .P يفهم glibc ماكروات اختبار الميزات التالية: .TP \fB__STRICT_ANSI__\fP C القياسي ISO. يُعرف هذا الماكرو ضمنيًا بواسطة \fBgcc\fP(1) عند استدعائه مع، على سبيل المثال، العلم \fI\-std=c99\fP أو \fI\-ansi\fP. .TP \fB_POSIX_C_SOURCE\fP تعريف هذا الماكرو يتسبب في كشف ملفات الرأس للتعريفات كما يلي: .RS .IP \[bu] 3 القيمة 1 تكشف تعريفات متوافقة مع POSIX.1\-1990 وISO C (1990). .IP \[bu] القيمة 2 أو أكبر تكشف بالإضافة تعريفات لـ POSIX.2\-1992. .IP \[bu] .\" 199506L functionality is available only since glibc 2.1 القيمة 199309L أو أكبر تكشف بالإضافة تعريفات لـ POSIX.1b (امتدادات الوقت الحقيقي). .IP \[bu] القيمة 199506L أو أكبر تكشف بالإضافة تعريفات لـ POSIX.1c (الخيوط). .IP \[bu] (منذ glibc 2.3.3) القيمة 200112L أو أكبر تكشف بالإضافة تعريفات مقابلة لمواصفة POSIX.1\-2001 الأساسية (باستثناء امتداد XSI). تتسبب هذه القيمة أيضًا في كشف ميزات C95 (منذ glibc 2.12) وC99 (منذ glibc 2.10) (بمعنى آخر، ما يعادل تعريف \fB_ISOC99_SOURCE\fP). .IP \[bu] (منذ glibc 2.10) القيمة 200809L أو أكبر تكشف بالإضافة تعريفات مقابلة لمواصفة POSIX.1\-2008 الأساسية (باستثناء امتداد XSI). .RE .TP \fB_POSIX_SOURCE\fP تعريف هذا الماكرو القديم بأي قيمة يعادل تعريف \fB_POSIX_C_SOURCE\fP بالقيمة 1. .IP بما أن هذا الماكرو قديم، لا يُوثق استخدامه عمومًا عند مناقشة متطلبات ماكرو اختبار الميزات في صفحات الدليل. .TP \fB_XOPEN_SOURCE\fP تعريف هذا الماكرو يتسبب في كشف ملفات الرأس للتعريفات كما يلي: .RS .IP \[bu] 3 تعريفه بأي قيمة يكشف تعريفات متوافقة مع POSIX.1 وPOSIX.2 وXPG4. .IP \[bu] القيمة 500 أو أكبر تُظهر بالإضافة إلى ذلك تعريفات لـ SUSv2 (UNIX 98). .IP \[bu] (منذ glibc 2.2) القيمة 600 أو أكبر تُظهر بالإضافة إلى ذلك تعريفات لـ SUSv3 (UNIX 03؛ أي المواصفة الأساسية POSIX.1\-2001 بالإضافة إلى امتداد XSI) وتعريفات C99. .IP \[bu] (منذ glibc 2.10) القيمة 700 أو أكبر تُظهر بالإضافة إلى ذلك تعريفات لـ SUSv4 (أي المواصفة الأساسية POSIX.1\-2008 بالإضافة إلى امتداد XSI). .RE .IP إذا لم يُعرف \fB__STRICT_ANSI__\fP، أو عُرف \fB_XOPEN_SOURCE\fP بقيمة أكبر من أو تساوي 500 \fIو\fP لم يُعرف صراحةً لا \fB_POSIX_SOURCE\fP ولا \fB_POSIX_C_SOURCE\fP، فإن الكليّات التالية تُعرف ضمنيًا: .RS .IP \[bu] 3 \fB_POSIX_SOURCE\fP يُعرف بالقيمة 1. .IP \[bu] \fB_POSIX_C_SOURCE\fP يُعرف، وفقًا لقيمة \fB_XOPEN_SOURCE\fP: .RS .TP \fB_XOPEN_SOURCE\fP < 500 \fB_POSIX_C_SOURCE\fP يُعرف بالقيمة 2. .TP 500 <= \fB_XOPEN_SOURCE\fP < 600 \fB_POSIX_C_SOURCE\fP يُعرف بالقيمة 199506L. .TP 600 <= \fB_XOPEN_SOURCE\fP < 700 \fB_POSIX_C_SOURCE\fP يُعرف بالقيمة 200112L. .TP 700 <= \fB_XOPEN_SOURCE\fP (منذ glibc 2.10) \fB_POSIX_C_SOURCE\fP يُعرف بالقيمة 200809L. .RE .RE .IP بالإضافة إلى ذلك، تعريف \fB_XOPEN_SOURCE\fP بقيمة 500 أو أكبر يُنتج نفس التأثيرات كتعريف \fB_XOPEN_SOURCE_EXTENDED\fP. .TP \fB_XOPEN_SOURCE_EXTENDED\fP إذا عُرفت هذه الكلية، \fIو\fP عُرف \fB_XOPEN_SOURCE\fP، فتُظهر تعريفات مقابلة لامتدادات UNIX XPG4v2 (SUSv1) (UNIX 95). تعريف \fB_XOPEN_SOURCE\fP بقيمة 500 أو أكثر يُنتج أيضًا نفس التأثير كتعريف \fB_XOPEN_SOURCE_EXTENDED\fP. يجب تجنب استخدام \fB_XOPEN_SOURCE_EXTENDED\fP في شيفرة مصدرية جديدة. .IP بما أن تعريف \fB_XOPEN_SOURCE\fP بقيمة 500 أو أكثر له نفس تأثير تعريف \fB_XOPEN_SOURCE_EXTENDED\fP، فإن الكلية الأخيرة (المهجورة) لاختبار الميزة لا تُوصف عمومًا في SYNOPSIS في صفحات الدليل. .TP \fB_ISOC99_SOURCE\fP (منذ glibc 2.1.3) تُظهر تصريحات متوافقة مع معيار ISO C99. تعريف هذه الكلية يُظهر أيضًا تعريفات ISO C (1990) التعديل 1 ("C95"). (التغيير الرئيسي في C95 كان دعم مجموعات المحارف الدولية.) .IP استدعاء مترجم C بالخيار \fI\-std=c99\fP يُنتج نفس التأثيرات كتعريف هذه الكلية. .TP \fB_ISOC11_SOURCE\fP (منذ glibc 2.16) تُظهر تصريحات متوافقة مع معيار ISO C11. تعريف هذه الكلية يُفعّل أيضًا ميزات C99 و C95 (مثل \fB_ISOC99_SOURCE\fP). .IP استدعاء مترجم C بالخيار \fI\-std=c11\fP يُنتج نفس التأثيرات كتعريف هذه الكلية. .TP \fB_ISOC23_SOURCE\fP (منذ glibc 2.40) تكشف عن تصريحات متوافقة مع معيار ISO C23. .IP منذ glibc 2.31، تم التعرف على ماكرو مكافئ باسم \fB_ISOC2X_SOURCE\fP (لأن معيار C23 لم يكن قد تم الانتهاء منه آنذاك). على الرغم من أن استخدام هذا الماكرو قديم، إلا أن glibc يستمر في التعرف عليه للتوافق مع الإصدارات السابقة. .IP تعريف \fB_ISOC23_SOURCE\fP يُفعّل أيضًا ميزات C11 و C99 و C95. .IP استدعاء مترجم C مع الخيار \fI\-std=c23\fP يُنتج نفس تأثيرات تعريف هذا الماكرو. .TP \fB_LARGEFILE64_SOURCE\fP تكشف عن تعريفات لواجهة برمجة التطبيقات البديلة المحددة من قبل LFS (قمة الملفات الكبيرة) كـ "امتداد انتقالي" لمواصفات UNIX الموحدة. (انظر .UR http:\:/\:/opengroup.org\:/platform\:/lfs.html .UE .) تتكون واجهة برمجة التطبيقات البديلة من مجموعة من الكائنات الجديدة (أي الدوال والأنواع) التي تُلحق أسماؤها بـ "64" (مثل \fIoff64_t\fP مقابل \fIoff_t\fP، \fBlseek64\fP() مقابل \fBlseek\fP()، إلخ.). لا ينبغي للبرامج الجديدة استخدام هذا الماكرو؛ بدلاً من ذلك، يجب استخدام \fI_FILE_OFFSET_BITS=64\fP. .TP \fB_LARGEFILE_SOURCE\fP تم استخدام هذا الماكرو تاريخيًا لكشف دوال معينة (تحديدًا \fBfseeko\fP(3) و \fBftello\fP(3)) التي تعالج قيود واجهات برمجة التطبيقات السابقة (\fBfseek\fP(3) و \fBftell\fP(3)) التي تستخدم \fIlong\fP لإزاحات الملف. يتم تعريف هذا الماكرو ضمنيًا إذا تم تعريف \fB_XOPEN_SOURCE\fP بقيمة أكبر من أو تساوي 500. لا ينبغي للبرامج الجديدة استخدام هذا الماكرو؛ تعريف \fB_XOPEN_SOURCE\fP كما هو موصوف أو تعريف \fB_FILE_OFFSET_BITS\fP بالقيمة 64 هو الآلية المفضلة لتحقيق نفس النتيجة. .TP \fB_FILE_OFFSET_BITS\fP تعريف هذا الماكرو بالقيمة 64 يحول آليًا المراجع إلى دوال وأنواع بيانات 32 بت المتعلقة بإدخال/إخراج الملف وعمليات نظام الملفات إلى مراجع لنظيراتها 64 بت. هذا مفيد لأداء الإدخال/الإخراج على ملفات كبيرة (أكبر من 2 جيجابايت) على أنظمة 32 بت. كما أنه مفيد عند استدعاء دوال مثل \fBcopy_file_range\fP(2) التي أُضيفت مؤخرًا وتأتي فقط بنكهات 64 بت. (تعريف هذا الماكرو يسمح للبرامج المكتوبة بشكل صحيح باستخدام الملفات الكبيرة مع اشتراط إعادة ترجمة فقط.) .IP تسمح أنظمة 64 بت بطبيعة الحال بأحجام ملفات أكبر من 2 جيجابايت، وليس لهذا الماكرو أي تأثير على تلك الأنظمة. .TP \fB_TIME_BITS\fP تعريف هذا الماكرو بالقيمة 64 يُغير عرض \fBtime_t\fP(3type) إلى 64 بت مما يسمح بمعالجة الطوابع الزمنية بعد عام 2038. يرتبط ارتباطًا وثيقًا بـ \fB_FILE_OFFSET_BITS\fP وقد يتطلب تعيينه اعتمادًا على التنفيذ. هذا الماكرو متاح اعتبارًا من glibc 2.34. .TP \fB_BSD_SOURCE\fP (مهمل منذ glibc 2.20) تعريف هذا الماكرو بأي قيمة يتسبب في كشف ملفات الرأس عن تعريفات مشتقة من BSD. .IP في إصدارات glibc حتى 2.18، يتسبب تعريف هذا الماكرو أيضًا في تفضيل تعريفات BSD في بعض المواقف حيث تتعارض المعايير، ما لم يتم تعريف واحد أو أكثر من \fB_SVID_SOURCE\fP أو \fB_POSIX_SOURCE\fP أو \fB_POSIX_C_SOURCE\fP أو \fB_XOPEN_SOURCE\fP أو \fB_XOPEN_SOURCE_EXTENDED\fP أو \fB_GNU_SOURCE\fP، وفي هذه الحالة لا تُفضل تعريفات BSD. منذ glibc 2.19، لم يعد \fB_BSD_SOURCE\fP يتسبب في تفضيل تعريفات BSD في حالة التعارضات. .IP .\" commit c941736c92fa3a319221f65f6755659b2a5e0a20 .\" commit 498afc54dfee41d33ba519f496e96480badace8e .\" commit acd7f096d79c181866d56d4aaf3b043e741f1e2c .\" commit ade40b10ff5fa59a318cf55b9d8414b758e8df78 منذ glibc 2.20، هذا الماكرو مهمل. له الآن نفس تأثير تعريف \fB_DEFAULT_SOURCE\fP، لكنه يُنشئ تحذيرًا في وقت الترجمة (ما لم يتم تعريف \fB_DEFAULT_SOURCE\fP أيضًا). استخدم \fB_DEFAULT_SOURCE\fP بدلاً من ذلك. للسماح للكود الذي يتطلب \fB_BSD_SOURCE\fP في glibc 2.19 والإصدارات الأقدم و \fB_DEFAULT_SOURCE\fP في glibc 2.20 والإصدارات الأحدث بالترجمة دون تحذيرات، قم بتعريف \fIكليهما\fP \fB_BSD_SOURCE\fP و \fB_DEFAULT_SOURCE\fP. .TP \fB_SVID_SOURCE\fP (مهمل منذ glibc 2.20) تعريف هذا الماكرو بأي قيمة يتسبب في كشف ملفات الرأس عن تعريفات مشتقة من System V. (SVID == تعريف واجهة System V؛ انظر \fBstandards\fP(7).) .IP منذ glibc 2.20، هذا الماكرو مهمل بنفس طريقة \fB_BSD_SOURCE\fP. .TP \fB_DEFAULT_SOURCE\fP (منذ glibc 2.19) يمكن تعريف هذا الماكرو لضمان توفير التعريفات "الافتراضية" حتى عندما يتم تعطيل الافتراضيات بخلاف ذلك، كما يحدث عندما يتم تعريف ماكرو فردي بشكل صريح، أو يتم استدعاء المترجم في أحد أوضاعه "القياسية" (مثل \fIcc\ \-std=c99\fP). تعريف \fB_DEFAULT_SOURCE\fP دون تعريف ماكرو فردي آخر أو استدعاء المترجم في أحد أوضاعه "القياسية" ليس له أي تأثير. .IP تتضمن التعريفات "الافتراضية" تلك المطلوبة بواسطة POSIX.1\-2008 و ISO C99، بالإضافة إلى تعريفات متنوعة مشتقة أصلاً من BSD و System V. في glibc 2.19 والإصدارات الأقدم، كانت هذه الافتراضيات مكافئة تقريبًا لتعريف ما يلي بشكل صريح: .IP .in +4n .EX cc \-D_BSD_SOURCE \-D_SVID_SOURCE \-D_POSIX_C_SOURCE=200809 .EE .in .TP \fB_ATFILE_SOURCE\fP (منذ glibc 2.4) تحديد هذه الكلية بأي قيمة يجعل ملفات الرأس تعرض تصريحات لمجموعة من الدوال ذات اللاحقة "at"؛ انظر \fBopenat\fP(2). منذ glibc 2.10، تُعرّف هذه الكلية ضمنيًا أيضًا إذا عُرّفت \fB_POSIX_C_SOURCE\fP بقيمة أكبر من أو تساوي 200809L. .TP \fB_GNU_SOURCE\fP تحديد هذه الكلية (بأي قيمة) يُعرّف ضمنيًا \fB_ATFILE_SOURCE\fP، \fB_LARGEFILE64_SOURCE\fP، \fB_ISOC99_SOURCE\fP، \fB_XOPEN_SOURCE_EXTENDED\fP، \fB_POSIX_SOURCE\fP، \fB_POSIX_C_SOURCE\fP بالقيمة 200809L (200112L قبل glibc 2.10؛ 199506L قبل glibc 2.5؛ 199309L قبل glibc 2.1) و \fB_XOPEN_SOURCE\fP بالقيمة 700 (600 قبل glibc 2.10؛ 500 قبل glibc 2.2). بالإضافة إلى ذلك، تُعرض أيضًا إضافات متنوعة خاصة بـ GNU. .IP منذ glibc 2.19، تحديد \fB_GNU_SOURCE\fP له أيضًا تأثير تعريف \fB_DEFAULT_SOURCE\fP ضمنيًا. قبل glibc 2.20، تحديد \fB_GNU_SOURCE\fP كان له أيضًا تأثير تعريف \fB_BSD_SOURCE\fP و \fB_SVID_SOURCE\fP ضمنيًا. .TP \fB_REENTRANT\fP .\" Zack Weinberg .\" There did once exist C libraries where it was necessary. The ones .\" I remember were proprietary Unix vendor libcs from the mid-1990s .\" You would get completely unlocked stdio without _REENTRANT. تاريخيًا، في مكتبات C متنوعة، كان من الضروري تعريف هذه الكلية في كل الشيفرة متعددة الخيوط. (قد تظل بعض مكتبات C تتطلب هذا.) في glibc، عرضت هذه الكلية أيضًا تعريفات لدوال معينة قابلة لإعادة الدخول. .IP مع ذلك، glibc آمن للخيوط مبدئيًا لسنوات عديدة؛ منذ glibc 2.3، التأثير الوحيد لتعريف \fB_REENTRANT\fP هو تمكين تصريح واحد أو اثنين من نفس التصريحات التي تُمكن أيضًا بتعريف \fB_POSIX_C_SOURCE\fP بقيمة 199606L أو أكبر. .IP \fB_REENTRANT\fP أصبحت الآن مهملة. في glibc 2.25 وما بعده، تعريف \fB_REENTRANT\fP يعادل تعريف \fB_POSIX_C_SOURCE\fP بالقيمة 199606L. إذا اختير مستوى توافق POSIX أعلى بأي وسيلة أخرى (مثل \fB_POSIX_C_SOURCE\fP نفسها، \fB_XOPEN_SOURCE\fP، \fB_DEFAULT_SOURCE\fP، أو \fB_GNU_SOURCE\fP)، فإن تعريف \fB_REENTRANT\fP ليس له أي تأثير. .IP تُعرّف هذه الكلية آليًا إذا جُمّع باستخدام \fIcc\ \-pthread\fP. .TP \fB_THREAD_SAFE\fP مرادف لـ \fB_REENTRANT\fP (المهملة)، مُوفّر للتوافق مع بعض التطبيقات الأخرى. .TP \fB_FORTIFY_SOURCE\fP (منذ glibc 2.3.4) .\" For more detail, see: .\" http://gcc.gnu.org/ml/gcc-patches/2004-09/msg02055.html .\" [PATCH] Object size checking to prevent (some) buffer overflows .\" * From: Jakub Jelinek .\" * To: gcc-patches at gcc dot gnu dot org .\" * Date: Tue, 21 Sep 2004 04:16:40 -0400 .\" Look for __USE_FORTIFY_LEVEL in the header files تحديد هذه الكلية يُسبب إجراء بعض الفحوصات الخفيفة لاكتشاف بعض أخطار تجاوز سعة المخزن المؤقت عند استخدام دوال متنوعة لمعالجة السلاسل والذاكرة (مثلًا، \fBmemcpy\fP(3)، \fBmemset\fP(3)، \fBstpcpy\fP(3)، \fBstrcpy\fP(3)، \fBstrncpy\fP(3)، \fBstrcat\fP(3)، \fBstrncat\fP(3)، \fBsprintf\fP(3)، \fBsnprintf\fP(3)، \fBvsprintf\fP(3)، \fBvsnprintf\fP(3)، \fBgets\fP(3)، ومتغيرات الأحرف العريضة منها). لبعض الدوال، يُفحص تناسق الوسائط؛ مثلًا، يُفحص أن \fBopen\fP(2) زُوّد بوسيطة \fImode\fP عندما تتضمن الأعلام المحددة \fBO_CREAT\fP. لا تُكتشف كل المشكلات، فقط بعض الحالات الشائعة. .IP .\" For example, given the following code .\" int d; .\" char buf[1000], buf[1000]; .\" strcpy(fmt, "Hello world\n%n"); .\" snprintf(buf, sizeof(buf), fmt, &d); .\" .\" Compiling with "gcc -D_FORTIFY_SOURCE=2 -O1" and then running will .\" cause the following diagnostic at run time at the snprintf() call .\" .\" *** %n in writable segment detected *** .\" Aborted (core dumped) .\" إذا ضُبطت \fB_FORTIFY_SOURCE\fP إلى 1، مع مستوى تحسين المترجم 1 (\fIgcc\ \-O1\fP) وما فوق، تُجرى فحوصات لا ينبغي أن تغير سلوك البرامج المطابقة. مع ضبط \fB_FORTIFY_SOURCE\fP إلى 2، يُضاف بعض الفحص الإضافي، لكن بعض البرامج المطابقة قد تفشل. .IP بعض الفحوصات يمكن إجراؤها في وقت التجميع (عبر منطق الكليات المُنفّذ في ملفات الرأس)، وتنتج عنها تحذيرات المترجم؛ فحوصات أخرى تحدث في وقت التشغيل، وتنتج عنها خطأ في وقت التشغيل إذا فشل الفحص. .IP مع ضبط \fB_FORTIFY_SOURCE\fP إلى 3، يُضاف فحص إضافي لاعتراض بعض استدعاءات الدوال المستخدمة مع وسيطة ذات حجم متغير حيث يمكن للمترجم استنتاج حد أعلى لقيمتها. مثلًا، برنامج حيث وسيطة الحجم لـ \fBmalloc\fP(3) متغيرة يمكن الآن تحصينه. .IP .\" glibc is not an absolute requirement (gcc has libssp; NetBSD/newlib .\" and Darwin each have their own implementation), but let's keep it .\" simple. استخدام هذه الكلية يتطلب دعم المترجم، المتاح منذ gcc 4.0 و clang 2.6. استخدام \fB_FORTIFY_SOURCE\fP المضبوطة إلى 3 يتطلب gcc 12.0 أو أحدث، أو clang 9.0 أو أحدث، بالتزامن مع glibc 2.33 أو أحدث. .SS "التعريفات المبدئية، التعريفات الضمنية، ودمج التعريفات" إذا لم تُعرّف أي كليات اختبار ميزات بشكل صريح، فإن كليات اختبار الميزات التالية تُعرّف مبدئيًا: \fB_BSD_SOURCE\fP (في glibc 2.19 وما قبله)، \fB_SVID_SOURCE\fP (في glibc 2.19 وما قبله)، \fB_DEFAULT_SOURCE\fP (منذ glibc 2.19)، \fB_POSIX_SOURCE\fP، و \fB_POSIX_C_SOURCE\fP=200809L (200112L قبل glibc 2.10؛ 199506L قبل glibc 2.4؛ 199309L قبل glibc 2.1). .P إذا عُرّف أي من \fB__STRICT_ANSI__\fP، \fB_ISOC99_SOURCE\fP، \fB_ISOC11_SOURCE\fP (منذ glibc 2.18)، \fB_ISOC23_SOURCE\fP (منذ glibc 2.40)، \fB_POSIX_SOURCE\fP، \fB_POSIX_C_SOURCE\fP، \fB_XOPEN_SOURCE\fP، \fB_XOPEN_SOURCE_EXTENDED\fP (في glibc 2.11 وما قبله)، \fB_BSD_SOURCE\fP (في glibc 2.19 وما قبله)، أو \fB_SVID_SOURCE\fP (في glibc 2.19 وما قبله) بشكل صريح، فإن \fB_BSD_SOURCE\fP، \fB_SVID_SOURCE\fP، و \fB_DEFAULT_SOURCE\fP لا تُعرّف مبدئيًا. .P إذا لم يُعرّف \fB_POSIX_SOURCE\fP و \fB_POSIX_C_SOURCE\fP بشكل صريح، وإما لم يُعرّف \fB__STRICT_ANSI__\fP أو عُرّف \fB_XOPEN_SOURCE\fP بقيمة 500 أو أكثر، فإن .IP \[bu] 3 \fB_POSIX_SOURCE\fP تُعرّف بالقيمة 1؛ و .IP \[bu] \fB_POSIX_C_SOURCE\fP تُعرّف بإحدى القيم التالية: .RS .IP \[bu] 3 2، إذا عُرّف \fB_XOPEN_SOURCE\fP بقيمة أقل من 500؛ .IP \[bu] 199506L، إذا عُرّف \fB_XOPEN_SOURCE\fP بقيمة أكبر من أو تساوي 500 وأقل من 600؛ أو .IP \[bu] (منذ glibc 2.4) 200112L، إذا عُرّف \fB_XOPEN_SOURCE\fP بقيمة أكبر من أو تساوي 600 وأقل من 700. .IP \[bu] (منذ glibc 2.10) 200809L، إذا عُرّف \fB_XOPEN_SOURCE\fP بقيمة أكبر من أو تساوي 700. .IP \[bu] الإصدارات الأقدم من glibc لا تعرف القيمتين 200112L و200809L لـ \fB_POSIX_C_SOURCE\fP، وسيعتمد ضبط هذا الكلي على إصدار glibc. .IP \[bu] إذا كان \fB_XOPEN_SOURCE\fP غير معرّف، فإن ضبط \fB_POSIX_C_SOURCE\fP يعتمد على إصدار glibc: 199506L، قبل glibc 2.4؛ 200112L، من glibc 2.4 إلى glibc 2.9؛ و200809L، منذ glibc 2.10. .RE .P يمكن تعريف عدة كليات؛ النتائج تراكمية. .SH المعايير يحدد POSIX.1 \fB_POSIX_C_SOURCE\fP و\fB_POSIX_SOURCE\fP و\fB_XOPEN_SOURCE\fP. .P \fB_FILE_OFFSET_BITS\fP غير محدد بأي معيار، لكنه يُستخدم في بعض التطبيقات الأخرى. .P \fB_BSD_SOURCE\fP و\fB_SVID_SOURCE\fP و\fB_DEFAULT_SOURCE\fP و\fB_ATFILE_SOURCE\fP و\fB_GNU_SOURCE\fP و\fB_FORTIFY_SOURCE\fP و\fB_REENTRANT\fP و\fB_THREAD_SAFE\fP خاصة بـ glibc. .SH التاريخ \fB_XOPEN_SOURCE_EXTENDED\fP حددته XPG4v2 (المعروفة بـ SUSv1)، لكنه غير موجود في SUSv2 وما بعده. .SH ملاحظات \fI\fP هو ملف رأس خاص بـ Linux/glibc. الأنظمة الأخرى لديها ملف مماثل، لكن عادةً باسم مختلف. يُضمّن ملف الرأس هذا آليًا بواسطة ملفات رأس أخرى حسب الحاجة: ليس من الضروري تضمينه صراحة لاستخدام كليات اختبار الميزات. .P وفقًا لأي من كليات اختبار الميزات أعلاه مُعرّفة، يُعرّف \fI\fP داخليًا كليات أخرى متنوعة تُفحص بواسطة ملفات رأس glibc الأخرى. لهذه الكليات أسماء مسبوقة بشرطتين سفليتين (مثل \fB__USE_MISC\fP). يجب على البرامج \fIأبدًا\fP تعريف هذه الكليات مباشرة: بدلاً من ذلك، يجب استخدام كليّة (أو كليات) اختبار الميزات المناسبة من القائمة أعلاه. .SH أمثلة يمكن استخدام البرنامج أدناه لاستكشاف كيفية ضبط كليات اختبار الميزات المختلفة اعتمادًا على إصدار glibc وكليات اختبار الميزات المُعرّفة صراحة. جلسة الصدفة التالية، على نظام مع glibc 2.10، تُظهر بعض الأمثلة لما سنراه: .P .in +4n .EX $\fB cc ftm.c\fP $\fB ./a.out\fP _POSIX_SOURCE defined _POSIX_C_SOURCE defined: 200809L _BSD_SOURCE defined _SVID_SOURCE defined _ATFILE_SOURCE defined $\fB cc \-D_XOPEN_SOURCE=500 ftm.c\fP $\fB ./a.out\fP _POSIX_SOURCE defined _POSIX_C_SOURCE defined: 199506L _XOPEN_SOURCE defined: 500 $\fB cc \-D_GNU_SOURCE ftm.c\fP $\fB ./a.out\fP _POSIX_SOURCE defined _POSIX_C_SOURCE defined: 200809L _ISOC99_SOURCE defined _XOPEN_SOURCE defined: 700 _XOPEN_SOURCE_EXTENDED defined _LARGEFILE64_SOURCE defined _BSD_SOURCE defined _SVID_SOURCE defined _ATFILE_SOURCE defined _GNU_SOURCE defined .EE .in .SS "مصدر البرنامج" \& .EX /* ftm.c */ \& #include #include #include #include \& int main(int argc, char *argv[]) { #ifdef _POSIX_SOURCE printf("_POSIX_SOURCE defined\[rs]n"); #endif \& #ifdef _POSIX_C_SOURCE printf("_POSIX_C_SOURCE defined: %jdL\[rs]n", (intmax_t) _POSIX_C_SOURCE); #endif \& #ifdef _ISOC99_SOURCE printf("_ISOC99_SOURCE defined\[rs]n"); #endif \& #ifdef _ISOC11_SOURCE printf("_ISOC11_SOURCE defined\[rs]n"); #endif \& #ifdef _ISOC23_SOURCE printf("_ISOC23_SOURCE defined\[rs]n"); #endif \& #ifdef _XOPEN_SOURCE printf("_XOPEN_SOURCE defined: %d\[rs]n", _XOPEN_SOURCE); #endif \& #ifdef _XOPEN_SOURCE_EXTENDED printf("_XOPEN_SOURCE_EXTENDED defined\[rs]n"); #endif \& #ifdef _LARGEFILE64_SOURCE printf("_LARGEFILE64_SOURCE defined\[rs]n"); #endif \& #ifdef _FILE_OFFSET_BITS printf("_FILE_OFFSET_BITS defined: %d\[rs]n", _FILE_OFFSET_BITS); #endif \& #ifdef _TIME_BITS printf("_TIME_BITS defined: %d\[rs]n", _TIME_BITS); #endif \& #ifdef _BSD_SOURCE printf("_BSD_SOURCE defined\[rs]n"); #endif \& #ifdef _SVID_SOURCE printf("_SVID_SOURCE defined\[rs]n"); #endif \& #ifdef _DEFAULT_SOURCE printf("_DEFAULT_SOURCE defined\[rs]n"); #endif \& #ifdef _ATFILE_SOURCE printf("_ATFILE_SOURCE defined\[rs]n"); #endif \& #ifdef _GNU_SOURCE printf("_GNU_SOURCE defined\[rs]n"); #endif \& #ifdef _REENTRANT printf("_REENTRANT defined\[rs]n"); #endif \& #ifdef _THREAD_SAFE printf("_THREAD_SAFE defined\[rs]n"); #endif \& #ifdef _FORTIFY_SOURCE printf("_FORTIFY_SOURCE defined\[rs]n"); #endif \& exit(EXIT_SUCCESS); } .EE .SH "انظر أيضًا" \fBlibc\fP(7)، \fBstandards\fP(7)، \fBsystem_data_types\fP(7) .P .\" But beware: the info libc document is out of date (Jul 07, mtk) القسم "Feature Test Macros" تحت \fIinfo libc\fP. .P \fI/usr/include/features.h\fP .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .