استدعاء مكتبات C أصليا
لبات 0.7.0 · الإصدار الحالي
شغّل puts والتواقيع العددية الدقيقة وأمثلة المخزن المنسوخ باستخدام أداة 0.7.0 المنشورة.
محتويات الصفحة
تجهيز المضيف الأصلي
المضيف الأصلي فقط، إصدار لبات 0.7.0 المنشور. اتبع مسار التثبيت الأصلي ومتطلبات النظام أولا. تستخدم الأمثلة Linux x86-64 وSystem V ABI وglibc. توفر libc.so.6 الدوال puts وabs وstrlen وmemset؛ وتوفر libm.so.6 الدالة sqrt. لا تحتاج أسطر إدخال أو وحدات مصدر أو ملفات بيانات. يظل ملف ELF المبني محتاجا إلى مكتباته المشتركة المسماة.
نزّل نسخة مصدر موردة من مجموعة C. احتفظ باسم الملف وأسماء المستخدم الأصلية. قد يحتوي المصدر ذو الكلمات الإنجليزية أسماء مستخدم ونصوصا عربية. لا يوفر أي مثال C إجراء لفتحه في المتصفح.
الطباعة عبر ملف تعريف محوّل خارجي
يصرّح مثال puts بملف التعريف الدقيق c_int__const_char_ptr الذي يحول توقيع لبات من نص إلى ص64 إلى توقيع C int(const char *). يحتاج التصريح والاستدعاء إلى غير_آمن / unsafe. يتلقى C نسخة مؤقتة لا تخزين نص لبات. تضيف puts فاصلة LF بعد مرحبا. يفحص البرنامج نتيجة C السالبة ويعيد 0 عند النجاح؛ لا تصلح النتيجة الموجبة غير المحددة كحالة للعملية.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- المضيف الأصلي فقط. لبات 0.7.0 وLinux x86-64 مع glibc؛ يحتاج libc.so.6 وputs. لا وحدات مصدر أو ملفات بيانات.
الإدخال: لا يحتاج إلى أسطر إدخال.
غير_آمن خارجي اطبع_سطر(رسالة: نص) -> ص64
= سي_صحيح__مؤشر_محرف_ثابت("libc.so.6", "puts").
دالة ابدأ_الرئيسية() -> ص64 {
دع النتيجة = غير_آمن اطبع_سطر("مرحبا").
إذا النتيجة < 0 { أرجع 1. }
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل طباعة-سي.لباتالنتائج المتوقعة
{
"browser": {
"check": "policy-rejection",
"class": "policy-rejection",
"reason": "foreign-imports-not-supported",
"output": ""
},
"native": {
"check": 0,
"status": 0,
"output": "مرحبا\n"
}
}aspl check طباعة-سي.لبات
aspl run طباعة-سي.لبات
aspl build -o puts-program طباعة-سي.لبات
./puts-programاستخدم puts.aspl للنسخة الإنجليزية. يطبع النجاح مرحبا\n ويخرج بالحالة 0. يستخدم مثال double المحوّل c_double__double مع libm.so.6 وsqrt؛ يفحص أن sqrt(4.0) تساوي 2.0 ولا يطبع شيئا ويخرج بالحالة 0.
التصريح بتوقيع ثابت دقيق
يشتق الوسم السياقي سي / c توقيع C ثابتا من أنواع المصدر. في المثال العادي، تستخدم abs توقيعا من ص32 إلى ص32، وتستخدم strlen توقيعا من نص إلى ط64 مع نص_سي(text) / cstring(text). يتكون نصه العربي من عشرة بايتات UTF-8؛ لذلك تعيد strlen القيمة 10 لا خمسة محارف. يفحص البرنامج النتيجتين ولا يطبع شيئا ويعيد 0.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- المضيف الأصلي فقط. لبات 0.7.0 وLinux x86-64 مع glibc؛ يحتاج libc.so.6 وabs وstrlen. لا وحدات مصدر أو ملفات بيانات. اسم النسختين ordinary.aspl؛ احفظهما منفصلتين.
الإدخال: لا يحتاج إلى أسطر إدخال.
غير_آمن خارجي مطلق(قيمة: ص32) -> ص32 = سي("libc.so.6", "abs").
غير_آمن خارجي طول_البايتات(متن: نص) -> ط64 = سي("libc.so.6", "strlen", نص_سي(متن)).
دالة ابدأ_الرئيسية() -> ص64 {
إذا غير_آمن مطلق(ص32(-7)) ليس يطابق ص32(7) { أرجع 1. }
إذا غير_آمن طول_البايتات("مرحبا") ليس يطابق ط64(10) { أرجع 2. }
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل سي-عادي.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"output": ""
}
}aspl check ordinary.aspl
aspl run ordinary.aspl
aspl build -o ordinary-program ordinary.aspl
./ordinary-programتستخدم النسختان الاسم ordinary.aspl؛ احفظ واحدة في كل مرة أو ضعهما في مجلدين منفصلين. طابق توقيع C الحقيقي تماما. اقرأ جدول التواقيع قبل تعديل التصريح. لا يستورد لبات الترويسات ولا يستنتج توقيع الدالة من اسم الرمز.
نسخ البايتات إلى مخزن
يستورد مثال المخزن أساسي::سي، وينسخ 00 FF 41 من قائمة بايتات، ويغيّر القائمة الأصلية، ثم يستدعي memset بمدى إخراج صريح. تحتفظ القائمة المستخرجة الأولى ببايتاتها المنسوخة؛ ويتغير المخزن الأصلي المشترك إلى 20 20 20. يعالج الاستخراج الأكبر من السعة بالرمز foreign.invalid_argument ويغلق نسخة ويفحص foreign.closed عبر نسخة أخرى ثم يكرر الإغلاق بنجاح.
التنفيذ: المضيف الأصلي فقط · لبات 0.7.0
- المضيف الأصلي فقط. لبات 0.7.0 وLinux x86-64 مع glibc؛ يحتاج المكتبة الموردة أساسي::سي وlibc.so.6 مع memset. لا وحدات مصدر أو ملفات بيانات. اسم النسختين buffer.لبات؛ احفظهما منفصلتين.
الإدخال: لا يحتاج إلى أسطر إدخال.
استورد أساسي::سي.
غير_آمن خارجي املأ(هدف: سي::مخزن, بايت: ص32, عدد: ط64) -> مؤشر_سي
= سي("libc.so.6", "memset", إخراج(هدف, عدد)).
دالة ابدأ_الرئيسية() -> ص64 {
متغير مصدر: قائمة<ط8> = [0, 255, 65].
دع منشأ = سي::أنشئ_مخزن(مصدر).
إذا ليس منشأ::نجاح { اطبع(منشأ::الخطأ::الرمز). أرجع 1. }
دع مملوك = منشأ::قيمة.
دع مرادف = مملوك.
مصدر[0] = 7.
دع منسوخ = سي::انسخ_بايتات(مملوك, ط64(3)).
إذا ليس منسوخ::نجاح { أرجع 2. }
غير_آمن املأ(مملوك, ص32(32), ط64(3)).
دع معدل = سي::انسخ_بايتات(مرادف, ط64(3))::قيمة.
إذا منسوخ::قيمة[0] ليس يطابق 0 أو منسوخ::قيمة[1] ليس يطابق 255 أو منسوخ::قيمة[2] ليس يطابق 65 { أرجع 3. }
إذا معدل[0] ليس يطابق 32 أو معدل[1] ليس يطابق 32 أو معدل[2] ليس يطابق 32 { أرجع 4. }
دع متجاوز_الحجم = سي::انسخ_بايتات(مملوك, ط64(4)).
إذا متجاوز_الحجم::نجاح أو متجاوز_الحجم::الخطأ::الرمز ليس يطابق "foreign.invalid_argument" { أرجع 5. }
إذا ليس سي::أغلق(مملوك)::نجاح { أرجع 6. }
دع مغلق = سي::سعة(مرادف).
إذا مغلق::نجاح أو مغلق::الخطأ::الرمز ليس يطابق "foreign.closed" { أرجع 7. }
إذا ليس سي::أغلق(مرادف)::نجاح { أرجع 8. }
أرجع 0.
}
اتبع تعليمات Linux لتنفيذ هذا المثال. نزّل المصدر لحفظه.
تنزيل مخزن.لباتالنتائج المتوقعة
{
"native": {
"check": 0,
"status": 0,
"output": ""
}
}aspl check buffer.لبات
aspl run buffer.لبات
aspl build -o buffer-program buffer.لبات
./buffer-programتستخدم النسختان buffer.لبات؛ احتفظ بهما في مجلدين منفصلين. لا خرج عند النجاح والحالة 0. تتشارك نسخ مخزن / Buffer مالكا أصليا واحدا. ينسخ الإنشاء والاستخراج البايتات؛ ولا ينسخ الإسناد التخزين الأصلي القابل للتغيير. راجع عمليات المخزن والمديات.
تمييز الإخفاقات والحدود
يفحص check وbuild التصريحات دون فتح المكتبات. يحل run والبرنامج المولد كل التصريحات الخارجية قبل دالة البداية، بما فيها غير المستخدمة. يعطي غياب مكتبة أو رمز الحالة 4 ويمنع آثار المصدر. يعطي غياب وسم عدم الأمان أو التوقيع غير المدعوم خطأ مصدر بالحالة 1.
يسبب NUL داخل إعارة نص C فخا قبل دخول C بالحالة 5. يعطي ملف تعريف النص الأصلي السبب foreign-string-contains-nul؛ ويعطي cstring العام السبب invalid-foreign-argument. تسبب أعداد البايتات غير الصالحة والمخازن المغلقة والنسخ المتداخلة القابلة للكتابة فخا قبل الدخول أيضا. تعيد أدوات المخزن بدلا من ذلك نتيجة فاشلة للرفض الموثق. افحص ok قبل الوصول إلى value أو error؛ تعيد أغلق / close نتيجة وحدة دون قيمة قابلة للقراءة.
تعمل الاستدعاءات العادية غير الآمنة تزامنيا وقد تحجب التنفيذ أو تنهار. لا تمنح امتيازات الإلغاء أو الاستدعاءات الراجعة المدارة. توفر الأداة العامة روابط HTTP وRaylib مدارة ومراجعة، دون واجهة عامة لتثبيت روابط مدارة اعتباطية. تستبعد هذه المجموعة تجهيزات اختبار الاستدعاءات الراجعة الخاصة بالمساهمين. راجع مرجع الواجهات الخارجية أو مجموعة HTTP أو مجموعة Raylib للعقد المناسب.