رمز غير قابل للوصول
في برمجة الحاسوب ، يُعتبر الكود غير القابل للوصول جزءًا من الكود المصدري للبرنامج، والذي لا يمكن تنفيذه مطلقًا لعدم وجود مسار تحكم في تدفق البيانات من بقية البرنامج إلى هذا الكود. [ 1 ]
يُطلق على الكود غير القابل للوصول أحيانًا اسم الكود الميت ، [ 2 ] [ 3 ] على الرغم من أن الكود الميت قد يشير أيضًا إلى الكود الذي يتم تنفيذه ولكنه لا يؤثر على مخرجات البرنامج. [ 4 ]
يُعتبر الكود غير القابل للوصول إليه غير مرغوب فيه بشكل عام لعدة أسباب:
- إنه يستهلك الذاكرة بلا داعٍ.
- قد يتسبب ذلك في استخدام غير ضروري لذاكرة التخزين المؤقت للتعليمات الخاصة بوحدة المعالجة المركزية
- قد يؤدي هذا أيضًا إلى تقليل موضع البيانات
- قد يتم إنفاق الوقت والجهد في اختبار وصيانة وتوثيق التعليمات البرمجية التي لا يتم استخدامها مطلقًا
- أحيانًا يكون الاختبار الآلي هو الشيء الوحيد الذي يستخدم الكود.
قد يكون للشيفرة غير القابلة للوصول استخدامات مشروعة، مثل توفير مكتبة من الدوال لاستدعائها أو الانتقال إليها يدويًا عبر مصحح الأخطاء أثناء توقف البرنامج بعد نقطة توقف . يُعد هذا مفيدًا بشكل خاص لفحص الحالة الداخلية للبرنامج وعرضها بشكل مُنسق. قد يكون من المنطقي تضمين هذه الشيفرة في المنتج النهائي، بحيث يتمكن المطور من ربط مصحح الأخطاء بنسخة البرنامج قيد التشغيل لدى العميل.
الأسباب
قد توجد التعليمات البرمجية غير القابلة للوصول لأسباب عديدة، مثل:
- أخطاء البرمجة في الفروع الشرطية المعقدة
- نتيجة للتحويلات الداخلية التي يقوم بها مترجم مُحسِّن ؛
- اختبار غير مكتمل للتعليمات البرمجية الجديدة أو المعدلة
- الكود القديم
- تم استبدال الكود بتنفيذ آخر
- كود غير قابل للوصول قرر المبرمج عدم حذفه لأنه مختلط بكود قابل للوصول
- كود قابل للوصول إليه لا تحتاجه حالات الاستخدام الحالية أبدًا
- كود خامل يتم الاحتفاظ به عمداً تحسباً للحاجة إليه لاحقاً
- الكود المستخدم لأغراض تصحيح الأخطاء فقط.
الكود القديم هو الكود الذي كان مفيدًا في السابق ولكنه لم يعد يُستخدم أو مطلوبًا. وقد يكون الكود غير القابل للوصول جزءًا من مكتبة أو وحدة أو إجراء معقد، حيث يكون مفيدًا للآخرين أو في ظل ظروف لا تتحقق في سيناريو معين.
من الأمثلة على هذا النوع من التعليمات البرمجية التي لا يمكن الوصول إليها بشروط، تنفيذ دالة تنسيق سلاسل نصية عامة في مكتبة وقت تشغيل المُصرّف ، والتي تحتوي على تعليمات برمجية معقدة لمعالجة جميع الوسائط الممكنة، والتي لا يُستخدم منها فعليًا إلا جزء صغير. عادةً، لا تستطيع المُصرّفات إزالة أجزاء التعليمات البرمجية غير المستخدمة أثناء وقت الترجمة ، لأن سلوك البرنامج يتحدد إلى حد كبير بقيم الوسائط أثناء وقت التشغيل.
أمثلة
في هذا الجزء من كود لغة C:
دالة foo ( int x , int y ) { return x + y ; int z = x + y ; }لا يتم الوصول إلى التعريف أبدًا لأن الدالة تعود دائمًا قبل ذلك. لذلك، لا يحتاج المتغير إلى تخصيص مساحة تخزين أو تهيئته.intz=x+y;z
انتقل إلى خطأ الفشل
احتوى بروتوكول SSL/TLS الخاص بشركة Apple، الصادر في فبراير 2014، على ثغرة أمنية خطيرة تُعرف رسميًا باسم CVE - 2014-1266 ، وتُعرف بشكل غير رسمي باسم "خطأ goto fail". [ 5 ] [ 6 ] مقطع الشفرة ذو الصلة [ 7 ] هو:
static OSStatus SSLVerifySignedServerKeyExchange ( SSLContext * ctx , bool isRsa , SSLBuffer signedParams , uint8_t * signature , uint16_t signatureLen ) { OSStatus err ; // ... if (( err = SSLHashSHA1 . update ( & hashCtx , & serverRandom )) != 0 ) goto fail ; if (( err = SSLHashSHA1 . update ( & hashCtx , & signedParams )) != 0 ) goto fail ; goto fail ; if (( err = SSLHashSHA1 . final ( & hashCtx , & hashOut )) != 0 ) goto fail ;// ... فشل : SSLFreeBuffer ( & signedHashes ); SSLFreeBuffer ( & hashCtx ); return err ; }هنا، توجد goto failعبارتان متتاليتان. في بنية لغة C ، تكون العبارة الأولى فقط بعد ifعبارة غير محصورة بين قوسين مشروطة. goto failلذا، فإن العبارة الثانية غير مشروطة، وبالتالي تتجاوز دائمًا استدعاء الدالة SSLHashSHA1.final. ونتيجة لذلك، errستحتفظ الدالة بحالة عملية تحديث SHA1 ، وطالما SSLHashSHA1.updateنجح كلا الاستدعاءين، فلن تفشل عملية التحقق من التوقيع أبدًا . [ 5 ]
هنا، يُمثل الكود غير القابل للوصول استدعاء الدالة final. [ 6 ] تطبيق مُصرّف Clang مع خيار -Weverythingتضمين تحليل الكود غير القابل للوصول، والذي من شأنه أن يُطلق إنذارًا لهذا الكود. [ 6 ]
لغة سي++
في لغة C++ ، تُحدد بعض البنى البرمجية بسلوك غير مُعرّف . للمُصرّف حرية تنفيذ أي سلوك أو عدم تنفيذ أي سلوك، وعادةً ما يفترض المُصرّف المُحسّن أن الكود غير قابل للوصول. [ 8 ]
تحليل
يُعدّ اكتشاف التعليمات البرمجية غير القابلة للوصول أحد أشكال تحليل تدفق التحكم، ويهدف إلى تحديد التعليمات البرمجية التي لا يمكن الوصول إليها في أي حالة من حالات البرنامج. في بعض لغات البرمجة (مثل جافا [ 9 ] )، تُمنع بعض أنواع التعليمات البرمجية غير القابلة للوصول صراحةً. وتُعرف عملية التحسين التي تُزيل هذه التعليمات البرمجية باسم " إزالة التعليمات البرمجية غير المستخدمة" .
قد يصبح الكود غير قابل للوصول إليه نتيجة للتحويلات التي يقوم بها المترجم المحسن (على سبيل المثال، حذف التعبيرات الفرعية المشتركة ).
عمليًا، يؤثر مدى تعقيد التحليل بشكل كبير على كمية التعليمات البرمجية غير القابلة للوصول التي يتم اكتشافها. على سبيل المثال، يُظهر طي الثوابت وتحليل التدفق البسيط أن الجزء الداخلي من عبارة if في التعليمات البرمجية التالية غير قابل للوصول:
int n = 2 + 1 ;إذا كان ( ن == 4 ) { // غير قابل للوصول }ومع ذلك، هناك حاجة إلى قدر أكبر من التعقيد لمعرفة أن الكتلة المقابلة غير قابلة للوصول في الكود التالي:
#include <math.h>double x = sqrt ( 2 );إذا كان ( س > 5 ) { // غير قابل للوصول }تندرج تقنية إزالة التعليمات البرمجية التي لا يمكن الوصول إليها ضمن نفس فئة التحسينات مثل إزالة التعليمات البرمجية الميتة وإزالة التعليمات البرمجية الزائدة .
تسمح بعض لغات البرمجة بتحديد التعليمات البرمجية بشكل صريح على أنها غير قابلة للوصول:
- ج : عبر الماكرو (في ) [ 10 ]
unreachable()<stddef.h> - C++ : عبر الدالة (في )، وهي [ 11 ]
std::unreachable()<utility>[[noreturn]] - C# : يمكن الإشارة إلى ذلك باستخدام الفئة، باستخدام الطريقة [ 12 ]
System.Diagnostics.DebugDebug.Fail() - جافا : عادة ما يتم تمييزها عن طريق طرح الاستثناء [ 13 ]
java.lang.AssertionError - Rust : عبر الماكرو [ 14 ]
unreachable!() - Swift : عبر ، أو الدوال التي تُرجع [ 15 ]
fatalError()Never - زيج : عبر
unreachableالكلمة المفتاحية [ 16 ]
عدم إمكانية الوصول مقابل تحديد السمات الشخصية
في بعض الحالات، قد يكون النهج العملي مزيجًا من معايير عدم إمكانية الوصول البسيطة واستخدام أداة تحليل الأداء للتعامل مع الحالات الأكثر تعقيدًا. لا يُمكن لتحليل الأداء عمومًا إثبات عدم إمكانية الوصول إلى جزء من التعليمات البرمجية، ولكنه قد يكون أسلوبًا استدلاليًا جيدًا للعثور على التعليمات البرمجية التي يُحتمل عدم إمكانية الوصول إليها. بمجرد العثور على جزء مشتبه به من التعليمات البرمجية، يُمكن استخدام طرق أخرى، مثل أداة تحليل تعليمات برمجية أكثر قوة، أو حتى التحليل اليدوي، لتحديد ما إذا كانت التعليمات البرمجية غير قابلة للوصول بالفعل.
انظر أيضاً
- تغطية التعليمات البرمجية
- كود زائد
- رمز ميت
- رمز أوكس بو
- مشكلة التوقف – المشكلة العامة المتمثلة في تحديد ما إذا كان جزء من التعليمات البرمجية غير قابل للوصول إليه هي على الأقل بنفس صعوبة مشكلة التوقف، وبالتالي فهي غير قابلة للحل
مراجع
- ↑ ديبري، سوميا ك.؛ إيفانز، ويليام؛ موث، روبرت؛ دي سوتر، بيورن (1 مارس 2000). "تقنيات المترجمات لضغط الشيفرة". معاملات ACM في لغات البرمجة والأنظمة . 22 (2): 378-415 . CiteSeerX 10.1.1.43.7215 . doi : 10.1145/349214.349233 . S2CID 6129772 .
- ↑ اعتبارات البرمجيات في اعتماد أنظمة ومعدات الطيران وفقًا لمعيار RTCA/DO-178C . RTCA, Inc. 2011. ص 112. تاريخ الاطلاع: 11 يونيو 2019.
التعليمات البرمجية غير المستخدمة: هي تعليمات برمجية قابلة للتنفيذ (أو بيانات) ناتجة عن خطأ في تطوير البرمجيات، ولكن لا يمكن تنفيذها (التعليمات البرمجية) أو استخدامها (البيانات) في أي تكوين تشغيلي لبيئة الحاسوب المستهدفة. ولا يمكن تتبعها إلى أي متطلبات للنظام أو البرمجيات. غالبًا ما تُصنف الاستثناءات التالية خطأً على أنها تعليمات برمجية غير مستخدمة، ولكنها ضرورية لتنفيذ المتطلبات/التصميم: المعرفات المضمنة، وهياكل البرمجة الدفاعية لتحسين المتانة، والتعليمات البرمجية المعطلة مثل وظائف المكتبة غير المستخدمة. [بما أن المراجعة القائمة على المتطلبات يجب أن تحدد مثل هذا الكود على أنه غير قابل للتتبع إلى المتطلبات الوظيفية، فإن تحليل الكود الثابت يجب أن يحدد مثل هذا الكود على أنه غير قابل للوصول، وتحليل التغطية الهيكلية لنتائج الاختبار القائمة على المتطلبات يجب أن يحدد مثل هذا الكود على أنه غير قابل للوصول، فإن وجود كود ميت غير مبرر في مشروع ما يجب أن يثير النظر في فعالية عمليات التطوير والتحقق الخاصة بالمنظمة.]
- ↑ جاي توماس (24 يناير 2017). "تتبع المتطلبات يُشكل أساسًا لاختبار البرمجيات الشامل" . تم الاطلاع عليه بتاريخ 11 يونيو 2019.
يُمكن أن يُؤدي الجمع بين تتبع المتطلبات وتحليل التغطية إلى الكشف عن مناطق "البرمجيات غير المُستخدمة"، أي البرمجيات التي لا يتم تنفيذها مطلقًا. قد تُسبب هذه البرمجيات إزعاجًا في أغلب الأحيان، ولكنها قد تُشكل أيضًا تهديدًا أمنيًا إذا تمكن مُخترق من الوصول إليها والسيطرة عليها. إنها برمجيات لا يُمكن تتبعها، وبالتالي يجب حذفها.
- ↑ اتحاد MISRA (مارس 2013). إرشادات MISRA C:2012 لاستخدام لغة C في الأنظمة الحساسة . MIRA Limited . ص 41. مؤرشف من الأصل بتاريخ 3 أبريل 2019. تم الاطلاع عليه بتاريخ 11 يونيو 2019. القاعدة
2.2: لا يجوز وجود أي
كود غير مستخدم
. أي عملية يتم تنفيذها ولكن إزالتها لا تؤثر على سلوك البرنامج تُعتبر
كودًا غير مستخدم
.
- 1 2 آدم لانجلي (2014). "خطأ SSL/TLS في أبل" .
- 1 2 3 آري فان ديورسن (2014). "التعلم من ثغرة الأمان #gotofail من أبل" .
- ↑ "sslKeyExchange.c - شفرة المصدر لدعم تبادل المفاتيح وتبادل مفاتيح الخادم" . مؤرشف من الأصل بتاريخ 23 أبريل 2015. تم الاطلاع عليه بتاريخ 2 أبريل 2014 .
- ↑ " MSC15-C. لا تعتمد على السلوك غير المحدد" . جامعة كارنيجي ميلون. 2020. تم الاطلاع عليه بتاريخ 28 سبتمبر 2020.
نظرًا لأن المترجمات غير ملزمة بتوليد رمز للسلوك غير المحدد، فإن هذه السلوكيات تُعتبر مرشحة للتحسين.
- ↑ "مواصفات لغة جافا" .
- ↑ cppreference.com. "غير متاح" . cppreference.com . cppreference.com . تم الاطلاع عليه في 1 مايو 2026 .
- ↑ cppreference.com. "std::unreachable" . cppreference.com . cppreference.com . تم الاطلاع عليه في 1 مايو 2026 .
- ↑ مايكروسوفت ليرن. "طريقة Debug.Fail" . learn.microsoft.com . مايكروسوفت ليرن . تم الاطلاع عليه في 1 مايو 2026 .
- ↑ شركة أوراكل. "خطأ تأكيد الفئة" . docs.oracle.com . شركة أوراكل . تم الاطلاع عليه في 1 مايو 2026 .
- ↑ فريق Rust (14 أبريل 2026). "الماكرو غير قابل للوصول" . doc.rust-lang.org . فريق Rust.
- ↑ مطورو أبل. "خطأ فادح()" . developer.apple.com . مطورو أبل . تم الاطلاع عليه في 1 مايو 2026 .
- ↑ ziglang.org (14 أبريل 2026). "مرجع لغة زيج - غير متاح" . ziglang.org . ziglang.org.
- أبيل، أ. و. 1998. التنفيذ الحديث للمترجمات في جافا. مطبعة جامعة كامبريدج.
- موشنيك، الفصل الدراسي الثاني، 1997، تصميم وتنفيذ المترجمات المتقدمة. مورغان كوفمان.
- تحسينات المُترجم
- شذوذ البرمجيات
- شفرة المصدر
