سؤال

هل هذا آمن:

int main()
{
    boost::int16_t t1 = 50000; // overflow here.
    boost::uint16_t t2 = (boost::uint16_t)t1;
    std::cout << t1 << " "  << t2 <<  std::endl;
}

لكي أكون أكثر تحديداً: أقوم بتخزين هذه البيانات في جدول يستخدم أنواعًا موقعة في مخططه ، هل من الآمن تخزينها واسترداد هذه البيانات بهذه الطريقة؟

شكرًا!

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

المحلول

لا ، أعتقد أن هذا هو التنفيذ المحدد. من قياسي C ++ ، §4.7/3

إذا تم توقيع نوع الوجهة ، فسيتم تغيير القيمة إذا كان يمكن تمثيله في نوع الوجهة (وعرض الحقل) ؛ خلاف ذلك ، فإن القيمة هي التنفيذ.

هذا ينطبق على البيان الأول. int16_t تم توقيعه ، ولا يمكن أن يمثل 50000. وبالتالي فإن قيمة t1 يعتمد على التنفيذ.

عندما تعرف t1, t2 يضمنه الفقرة 4.7/2 ليكون أدنى uint16_t معامل متطابق 2^16 t1. أساسًا، t1 وزارة الدفاع 2^16.

نصائح أخرى

أود أن أقول أنها آمنة ، ولكن لماذا لا تستخدم UINT16_T دون المرور من خلال هذا الممثل المضلل؟

توجد أنواع للتواصل أيضًا ، ليس فقط من أجل عملية التجميع.

تعيين رقم لا يمكن تمثيله في نوع موقّع محدد. ومع ذلك ، فإن التحويل التالي له سلوك محدد قياسي. وبالتالي فإن نتيجة الوظيفة محددة ، إذا كانت هذه آمنة أم لا ، فهي مسألة ذاتية. لكن المحمولة عبر المنصات أو المجمعين ليس كذلك.

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