سؤال

أداة التحليل الثابتة التي نستخدمها هي رمز C للإشعال المشابهة لما يلي كتفيضات المخزن المؤقت الحرج.

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

رسالة خطأ الأداة هي: تجاوز سعة المخزن المؤقت (مؤشر الصفيف خارج الحدود): حجم مجموعة "BUF" هو 1. صفيف "BUF" قد يستخدم فهرس 0..64.

هل هذا شرعي؟ هل تؤدي مهمة مجموعة الأحرف إلى السلسلة الفارغة إلى تقليل طولها إلى بايت واحد، كما لو تم تعريفه على أنه char buf [] = "";?

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

المحلول

لا إعادة تعيين "" "" "" إلى BUF [SIZE + 1] حجم BUF، ولكن من غير المجدي، لأنه يكرر جزءا صغيرا من ما تفعله Memets اللاحقة (ويخلطه أداة التحليل الثابت - قد ترغب في تقديم الملفات تقرير الأخطاء مقابل ذلك).

نصائح أخرى

بصرف النظر عن حقيقة أن Char Buf [Size + 1] لن يترجم لأن الحجم هو قيمة وقت التشغيل، على افتراض أنك يمكن أن تبني BUF كصفيف مقاس 65، فإن ميمزة (BUF، 0، 65) لن يكون تجاوزا.

الاحتمالات هي الأداة الخاصة بك مرتبكة من قبل المشكلات الأساسية الخاصة بك.

تحرير: مزيد من المعلومات

بناء على التعليقات على مشاركتي الأصلية، أقترح ما يلي:

#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);

أعتقد أن روب كينيدي صحيح؛ تستخدم الأداة الخاصة بك قيمة السلسلة الفارغة كحجم الصفيف بدلا من إعلان الصفيف الثابت.

انها ليست فائض المخزن المؤقت.

ربما هذه طريقة نظافة للقيام بذلك. بالتأكيد يستغرق أقل خطوط التعليمات البرمجية.

#define size 64
char buf[size + 1] = {0};

انها قانونية - العازلة كبيرة بما فيه الكفاية. تحذرك الأداة منك أن Size_T قد يكون أكبر من كثافة التشغيل ومحاولة استخدامه حيث قد يؤدي الفهرس إلى نتائج غير متوقعة.

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