C6053

تحذير C6053: يتصل إلى <دالة> قد لا صفر-ينهي سلسلة <متغير>

ويشير هذا التحذير إلى استدعاء دالة معينة بطريقة التي قد لا تكون سلسلة الناتج صفر-منتهي. قد يتسبب هذا عيب بتجاوز سعة احتياطي exploitable أو التعطل الكلي. Th هو تحذير هو أيضا إنشاء إذا كان يتوقع دالة توضيحي سلسلة فارغة تم إنهاؤها — استخدام NullTerminatedخاصية في به Preشرط — هو تمرير سلسلة هو قيمة خالية منتهية.

معظم مكتبة C القياسية وسلسلة Win32 وظائف معالجة وإنتاج صفر-منتهي السلاسل. بعض الدالات 'عد السلسله' ( strncpy، wcsncpy، _mbsncpy، بما في ذلك _snprintf، و snwprintf) لا تعطي صفر-منتهي السلاسل في حالة قيامهم بتعبئة تماما بها احتياطي. في هذه حالة، استدعاء لاحقة إلى تتحول دالة سلسلة التي يتوقع سلسلة منتهية بصفر بعد إنهاء احتياطي الذي تبحث عنه من الصفر. البرنامج يجب التأكد من أن سلسلة ينتهي بصفر. بشكل عام، واحد من هذا الأسلوب مفيداً لتمرير بطول 'معدود سلسلة' عمل أحد أصغر من الحجم احتياطي وثم وضوح تعيين صفر إلى آخر حرف في احتياطي.

مثال

نموذج تعليمات برمجية التالي بإنشاء هذا تحذير:

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX);  
  return strlen(szDest); // possible crash here
}

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

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource="Hello, World!";

  strncpy(szDest, szSource, MAX-1);
  szDest[MAX-1]=0;
  return strlen(szDest);
}

نموذج تعليمات برمجية التالي تصحيح هذا التحذير باستخدام آمن سلسلة معالجة strncpy_sدالة:

#include <string.h>
#define MAX 15

size_t f( )
{
  char szDest[MAX];
  char *szSource= "Hello, World!";

  strncpy_s(szDest, sizeof(szDest), szSource, strlen(szSource));  
  return strlen(szDest);
}

يلي تعليمات برمجية يستخدم التعليق التوضيحي لإنشاء تحذير C6053:

#include<codeanalysis\sourceannotations.h>
using namespace vc_attributes;

void NotNullTerminatedStringReturned 
          (
           [Post(NullTerminated=No)] char* str
          )
{
  // code ...
}

void NullTerminatedStringRequired ([Pre(NullTerminated=Yes)] char* str)
{
  // code ...
}

void f (char* pC )
{
  NotNullTerminatedStringReturned(pC); //pC is not null terminated
  NullTerminatedStringRequired(pC); //requires null terminated pC
}

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

راجع أيضًا:

المرجع

NullTerminated

strncpy_s _strncpy_s_l ، wcsncpy_s ، _wcsncpy_s_l ، _mbsncpy_s ، _mbsncpy_s_l

المبادئ

نظرة عامة حول التعليقات التوضيحية