يفيض في إضافات size_t
-
03-07-2019 - |
سؤال
أرغب في الحصول على تحذير الكود الخاص بي مجانًا لـ 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...
}
ومنذ ذلك سيتم التفاف العودة إلى قيم أدنى يمكنك التحقق بسهولة إذا فاض.