سؤال
أنا أستخدم الكمبيوتر الشخصي لتحليل الكود الخاص بي والخطوط 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
يجب أن يكون حجم المكان المقصود المخزن المؤقت ، وليس السلسلة المصدر.