ماذا يعني [ملاحظة] في فقرة السلوك غير المحددة في معيار C ++؟

StackOverflow https://stackoverflow.com/questions/4274763

سؤال

كما المستخدم توني يشير الى هناك [ملاحظة] في الفقرة 1.3.12 من معيار C ++

يتراوح السلوك غير المحدد المسموح به من تجاهل الموقف تمامًا بنتائج غير متوقعة ، إلى التصرف أثناء الترجمة أو تنفيذ البرنامج بطريقة موثقة للبيئة ...

ألا يتناقض هذا مع تعريف UB قول ذلك ... هذا المعيار الدولي لا يفرض أي متطلبات؟ أعني أنهم يقولون "لا متطلبات" ثم يقولون "UB المسموح به" - في نفس الفقرة.

كيف ينبغي تفسير هذه الملاحظة؟ هل يحد بالفعل UB بأي شكل من الأشكال؟

هل كانت مفيدة؟

المحلول

من §6.5.1 من الجزء 3 من توجيهات ISO/IEC:

يجب استخدام الملاحظات والأمثلة المدمجة في نص المعيار فقط لإعطاء معلومات إضافية مخصصة للمساعدة في فهم أو استخدام المعيار ولا تحتوي على أحكام ضرورية من أجل أن تكون قادرة على المطالبة بالامتثال اساسي.

لذلك فهو غير طبيعي تمامًا (غير ملزم) ولا يعني إلا للتوضيح المحتمل.

نصائح أخرى

نظرًا لأن الملاحظات ليست معيارية ، فإنها لا تحد من UB بأي شكل من الأشكال. إنه مجرد توضيح أن التنفيذ يمكن أن يستخدم بعض التركيبات التي تتسبب رسميًا في UB كملحق موثق ، على الرغم من أن أي برنامج يعتمد على مثل هذه التفاصيل ، بالطبع ، غير محمول بأمان إلى بيئات أخرى.

تشرح هذه الملاحظة ما قد يفعله التنفيذ إذا واجه رمزًا لا يوجد سلوك محدد له. لا يُقصد بكلمة "مسموح" أن تكون قيودًا ، بل يتم تقديم بعض الأمثلة على السلوكيات الشائعة.

من المثير للاهتمام أن نلاحظ أن برنامج التحويل البرمجي دائمًا يجب أن يجمع شيئًا ما! النظر في هذا الجزء من الكود:

void f() { 1 / 0; }

لا يتم تعريف سلوك المترجم على مواجهة هذا بشكل جيد ، لكنه لا يمكن أن يفعل أي شيء يحبه! في الواقع إذا كان برنامج التحويل البرمجي ، فلا يزال مطلوبًا لتجميع وحدة التجميع هذه. ذلك لأن سلوك البرنامج الذي يحتوي على هذه الوظيفة يمكن أن يكون محددًا جيدًا! لا يمكن للمترجم معرفة ما إذا كانت الوظيفة تسمى. في الواقع ، نشأ هذا السؤال حيث كانت الوظيفة "رئيسية ()" وكان من المؤكد أن يتدفق السيطرة من خلال التقسيم الصفر ، والارتقاء هو أنه لا يُسمح للمترجم بالرفض حتى هذا البرنامج. والسبب هو: لا يزال البرنامج تم تشكيله جيدًا ، ويطلب من المترجم المطابق قبول جميع البرامج التي تم تشكيلها جيدًا (ويرفض جميع تلك غير المصنفة وتصدر رسالة خطأ تشخيصية ، ما لم ينص على خلاف ذلك).

لا يمكن بسهولة جعل هذا سيئًا لأنه من الصعب تحديد مدى حاجة المترجمين الذكيين إلى اكتشاف متى يجب أن يحدث تقسيم بحلول الصفر.

ومن المثير للاهتمام ، أن مطالبة المعيار بأنها "لا تفرض أي متطلبات" قريبة جدًا من الخطأ. إنها خصائص نظام التجميع الذي يدعم تجميع منفصل أنه لا يمكنه اكتشاف ما إذا كان هناك جزء من الكود لا يوجد فيه سلوك محدد جيدًا ، في الواقع ، وبالتالي فإن المترجم هو في الواقع مطلوب لتجميع شيء ما على أي حال ، لأنه لا يمكن أن نستنتج إذا كان برنامج لديه سلوك غير محدد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top