سؤال

أنا أستخدم الكمبيوتر الشخصي لتحليل الكود الخاص بي والخطوط Theese تولد العديد من الأخطاء. هذا يجعلني أتساءل عما إذا كان براتيس الترميز خاطئًا؟

char *start;
char *end;

// Extract the phone number
start = (char*) (strchr(data, '\"') +1);
end = (char*) strchr(start, '\"');
*end = 0;
strlcpy((char*)Fp_smsSender, start , start-(end-1));

تحرير: بعد مساعدتكم لدي الآن:

char *start;
char *end;

if (data != NULL)
{
  // Extract the phone number
  start = strchr(data, '\"');
  if (start != NULL)
  {
    ++start;
    end = strchr(start, '\"');

    if (end != NULL)
    {
      *end = 0;
      strlcpy((char*)Fp_smsSender, start , FP_MAX_PHONE);
    }
  }

كيف يبدو ذلك؟

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

المحلول

أتصور أن الوبر تشكو منه هو ذلك strchr() قد يعيد مؤشرًا فارغًا ، وأنت لا تتحقق من ذلك قبل أداء المؤشر الحسابي وإلغاء التخلص منه.

قد ترغب في فعل شيء مثل:

char *start;
char *end;

// Extract the phone number
start = strchr(data, '\"');
if (!start) handle_error();

++start; // skip the '\"'
end = strchr(start, '\"');
if (!end) handle_error();

*end = 0; 
strlcpy((char*)Fp_smsSender, start, size_of_Fp_smsSender_buffer);

لاحظ أنني غيرت المعلمة الأخيرة إلى strlcpy() اتصل - ما هي هذه المعلمة هو تحديد حجم المخزن المؤقت الوجهة حتى لا تتجاوزها. القيمة التي تمر بها لا معنى لها على الإطلاق ، وربما اشتكت Lint من ذلك أيضًا. ربما تقصد end-(start-1) والتي قد تكون أكثر ببساطة كما strlen(start)+1.

على أي حال ، حتى المرور strlen(start)+1 كمعلمة آخر ل strlcpy() ينتهك نية المعلمة ويزيل السلامة strlcpy() من المفترض أن توفر. قد تكون قد استخدمت ببساطة strcpy(Fp_smsSender,start) - وإذا كنت لا تعرف حجم Fp_smsSender العازلة الوجهة هي ، يجب عليك القيام بذلك بالضبط (أو إصلاح الأشياء حتى تعرف حجم المخزن المؤقت). سيكون من الواضح أكثر ما يفعله الرمز بالفعل.

نصائح أخرى

شيئان: أولاً لا تتعامل مع العائدات الفارغة من strchr.

ثانيًا (وأكثر جدية) ، الطول الذي تمر إليه strlcpy خاطئ: تريد end - start أو شيء مشابه (لديك عكس ذلك) ، ولكن بشكل أساسي ، حجة الطول strlcpy يجب أن يكون حجم المكان المقصود المخزن المؤقت ، وليس السلسلة المصدر.

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