سؤال

أرغب في الحصول على تحذير الكود الخاص بي مجانًا لـ VS.NET وGCC، وأحب أن يكون الكود الخاص بي جاهزًا للإصدار 64 بت.

لقد كتبت اليوم وحدة صغيرة تتعامل مع المخازن المؤقتة للذاكرة وتوفر الوصول إلى البيانات عبر واجهة نمط الملف (على سبيل المثال.يمكنك قراءة البايتات وكتابة البايتات والبحث وما إلى ذلك).

كنوع بيانات لموضع القراءة الحالي وحجمه، استخدمت size_t نظرًا لأن هذا يبدو الخيار الأكثر طبيعية.أتغلب على التحذيرات ويجب أن يعمل بنظام 64 بت أيضًا.

فقط في حالة:يبدو الهيكل الخاص بي كما يلي:

typedef struct
{
  unsigned char * m_Data;
  size_t          m_CurrentReadPosition;
  size_t          m_DataSize;
} MyMemoryFile;

توقيع size_t يبدو أنه لم يتم تعريفه في الممارسة العملية.أثبت بحث الكود في Google ذلك.

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

إذن - كيف يجب أن أكتب مثل هذا الكود بطريقة مستقلة عن النظام الأساسي والمترجم؟

هل يمكنني التحقق من توقيع size_t في التشغيل أو وقت الترجمة؟وهذا من شأنه أن يحل مشكلتي.أو ربما size_t لم تكن أفضل فكرة في المقام الأول.

أيه أفكار؟

يحرر:أبحث عن حل للغة C!

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

المحلول

وفيما يتعلق ما إذا كان وقع size_t أو غير موقعة ودول مجلس التعاون الخليجي (GCC من دليل القديم - أنا لست متأكدا ما اذا كان لا يزال هناك):

<اقتباس فقرة>   

وهناك مشكلة محتملة مع   نوع size_t والإصدارات من دول مجلس التعاون الخليجي قبل   للإفراج عن 2.4. يتطلب ANSI C أن   size_t يكون دائما نوع غير موقعة. إلى عن على   التوافق مع النظم القائمة '   رأس الملفات، ويحدد مجلس التعاون الخليجي size_t في   stddef.h أن يكون أي نوع من   sys/types.h النظام يعرف أن   يكون. معظم أنظمة يونكس التي تحدد   size_t في sys/types.h، وتحديد ل   يكون نوع الموقعة. بعض التعليمات البرمجية في   تعتمد المكتبة على size_t كونه   نوع غير موقعة، وسوف لا تعمل   بشكل صحيح إذا تم التوقيع عليه.

     

ورمز مكتبة GNU C التي تتوقع   size_t أن يكون غير الموقعة هو الصحيح. ال   تعريف size_t كنوع وقع   غير صحيح. نحن نخطط أن في الإصدار   2.4، ودول مجلس التعاون الخليجي تحديد دائما size_t كنوع غير موقعة، و   البرنامج النصي 'fixincludes "سيتم تدليك   sys/types.h النظام حتى لا   الصراع مع هذا.

     

في هذه الأثناء، ونحن نعمل حول هذا   المشكلة بقوله دول مجلس التعاون الخليجي بشكل صريح   استخدام نوع غير الموقعة لsize_t عندما   تجميع مكتبة GNU C.   'تكوين' سيتم الكشف عن تلقائيا   يستخدم نوع دول مجلس التعاون الخليجي لsize_t ترتيب   لتجاوز إذا لزم الأمر.

إذا كنت تريد نسخة موقعة من استخدام size_t ptrdiff_t أو على بعض الأنظمة هناك typedef ولssize_t.

نصائح أخرى

وsize_t هو نوع لا يتجزأ غير موقعة، وفقا لمعايير C ++ C. أي التنفيذ التي تمت size_t وقع هو مطابقة للمواصفات على محمل الجد، وربما يعاني من مشاكل قابلية الأخرى كذلك. فمن يضمن أن يلتف حول عندما تفيض، وهذا يعني أنه يمكنك كتابة الاختبارات مثل if (a + b < a) للعثور على تجاوز.

وsize_t هو نوع ممتاز للتنطوي على أي شيء الذاكرة. كنت أفعل ذلك الحق.

يجب غير الموقعة size_t.

وعادة ما هو تعريفها على أنها غير موقعة طويلة.

وأنا لم أر قط أن يعرف على خلاف ذلك. ssize_t هو نظيرتها الموقعة.

وتحرير: يحدد مجلس التعاون الخليجي أنها وقعت في بعض الظروف. يجب تجميع في وضع أسني C أو الأمراض المنقولة جنسيا-99 إجبارها على أن تكون غير موقعة.

بالنسبة للغة C استخدم IntSafe.تم إصداره أيضًا بواسطة Microsoft (يجب عدم الخلط بينه وبين مكتبة C++ SafeInt).IntSafe عبارة عن مجموعة من استدعاءات وظائف لغة C التي يمكنها إجراء العمليات الحسابية وإجراء التحويلات بأمان.عنوان URL المحدث لوظائف intsafe

safeint . وهي الطبقة التي صممها مايكل هوارد، وأفرج عن المصدر المفتوح من Microsoft. وهي مصممة لجعل العمل مع الأعداد الصحيحة حيث يتم تحديد الفائض باعتباره خطرا. يتم تحويل كافة تجاوزات للاستثناءات والتعامل معها. تم تصميم فئة لجعل الاستخدام الصحيح سهلة.

وعلى سبيل المثال:

char CouldBlowUp(char a, char b, char c)
{
   SafeInt<char> sa(a), sb(b), sc(c);

   try
   {
     return (sa * sb + sc).Value();
   }
   catch(SafeIntException err)
   {
      ComplainLoudly(err.m_code);
   }

   return 0;
}

وأيضا يستخدم safeint الكثير داخليا في مايكروسوفت في منتجات مثل مكتب.

المرجع: ربط النص

ولست متأكدا إذا فهمت السؤال بالضبط، ولكن ربما يمكنك أن تفعل شيئا مثل:

temp = value_to_be_added_to;

value_to_be_added_to += value_to_add;

if (temp > value_to_be_added_to)
{
  overflow...
}

ومنذ ذلك سيتم التفاف العودة إلى قيم أدنى يمكنك التحقق بسهولة إذا فاض.

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