C6057

تحذير C6057: مخزن مؤقت تجاوز سعة بسبب إلى عدد من الاحرف/عدد البايتات يوجد عدم تطابق في استدعاء إلى <دالة>

ويشير هذا التحذير إلى أن إحدى الوظائف التي يتوقع عدد حرف/ حروف التي يتم تمرير عدد وحدات البايت بدلاً من ذلك. مع أحرف (Unicode) واسع، تختلف قيم. قد يتسبب هذا عيب بتجاوز سعة احتياطي exploitable أو التعطل الكلي.

سبب شائع لترتيب هو defect هو استخدام sizeofتشغيل صفيفة حرف. sizeofعامل التشغيل دائماً بحساب عدد وحدات بايت؛ للأحرف ‏‫ANSI وهذا هو نفسه كـ العدد من حرف/ حروف، ولكن أحرف Unicode به لمرتين عدد حرف/ حروف.

هو عادة آمنة لحساب عدد العناصر في صفيفة بواسطة قسمة الحجم الصفيفة بالالحجم لكل عنصر.

مثال

تنشئ التعليمة البرمجية التالية th هو تحذير إذا أنه هو تحويله برمجياً باستخدام التعيين أحرف Unicode:

#include<tchar.h>
#include<windows.h>

void f( HINSTANCE hInst, UINT uID )
{
  TCHAR buff[128];
  if ( LoadString ( hInst, uID, buff, sizeof buff ) ) // warning C6057
  {
    // code...
  }
}

لتصحيح هذا التحذير، تقسيم الحجم الصفيف بالحجم العنصر كما هو موضح فيما يلي تعليمات برمجية:

#include<tchar.h>
#include<windows.h>

void f(HINSTANCE hInst,UINT uID)
{
  TCHAR buff[128];
  if( LoadString ( hInst, uID, buff, (sizeof buff)/(sizeof buff[0]) ) )
  {
    // code...
  }
}

لمعلومات حول كيفية إلى استخدام التعيين أحرف Unicode في Visual C + +، راجع صفحة خاصية عامة (مشروع). للحصول على مزيد من المعلومات حول LoadString، راجع دالة LoadString