ورود

View Full Version : علت دو warning



HAIdle
شنبه 06 مرداد 1386, 22:27 عصر
سلام به همه
به نظر شما چرا در قطعه کد زیر هشدار میده که strcpy را بد استفاده کرده اید؟


char z[100];
char* findNumber(char* str, int index)
{
char* res = new char(100);
int pos = 0;
int len = strlen(str);

for (int i=index; i<len && isDigitOrPeriodOrNegativeSign(str[i]); i++)
res[pos++] = str[i];
res[pos] = '\0';
return res;
}
...
strcpy(z, findNumber(str, zStart));
...

و همین طور در کد زیر:


double num = atof(str);
char* numStr = new char(100);
sprintf(numStr, "%20.2f", num);

emad_67
شنبه 06 مرداد 1386, 22:51 عصر
در مورد اولی قاعدتا نباید مشکلی باشه من با یه برنامه شبیه اون هم تست کردم مشکلی نبود البته اگه اینجوری تعریف کنی


#include<iostream.h>
#include<string.h>
char *find()
{
char res[10];
strcpy(res,"abcd");
return res;
}
void main()
{
char s[10];
strcpy(s,find());
cout<<s;
}

یه warning میده :"returning address of local variable or temporary"
مبنی بر اینکه آدرسی که return میشه موقتی هست و اگه دوباره بخواهیم از اون آدرس استفاده کنیم دیگه متغغیری در اون آدرس وجود نداره
در مورد سوال دوم هم در مورد تابع atof مشکلی وجود نداره ولی تست کردم warning نداد البته اصلا با sprintf یعنی اصلا با C کار نکردم
البته compiler من vc++ هست حالا نمیدونم شاید تو compiler شما در مورد ها که گقتین warning بده

HAIdle
یک شنبه 07 مرداد 1386, 13:28 عصر
کمپایلر من visual studio.net 2005 است

emad_67
یک شنبه 07 مرداد 1386, 13:46 عصر
نمیدونم مال من vc++ 6 هست warning هم نمیگیره

Anti_Evil
یک شنبه 07 مرداد 1386, 13:48 عصر
پیامی که از کامپایلر دریافت کردید رو پست کنید.

ولی اگر من به جای شما بودم به جای :



char* res = new char(100);


از این کد استفاده می کردم :



char * res = new char[100];


با تشکر،
هادی

sh_roohani
یک شنبه 07 مرداد 1386, 23:14 عصر
سلام،

VC 2005 توابع استاندارد C رو deprecated معرفی می کنه! نمی دونم اینم از اون کاراییه که غرور مایکروسافت بهش اجازه می ده انجام بده (مثل معرفی #C به عنوان یه ++C پیشرفته!)، یا واقعا ANSI هم استفاده از این توابع رو تقبیح کرده. به هر صورت اگه به هشدار ها توجه کنین، خودشون ماکروهایی رو معرفی می کنن که با تعریف اونا می تونین از شر این هشدارهای مزاحم خلاص بشین.

HAIdle
دوشنبه 08 مرداد 1386, 18:31 عصر
به هر صورت اگه به هشدار ها توجه کنین، خودشون ماکروهایی رو معرفی می کنن که با تعریف اونا می تونین از شر این هشدارهای مزاحم خلاص بشین.
میشه بگید مثلا چه ماکروهایی؟ مثلا برای strcpy یا sprintf چه ماکروهایی معرفی کرده؟ در پیام هشدار که چیزی نگفته. (ببخشید! میشه بگید اطولا ماکرو چیه؟؟:ناراحت:)

sh_roohani
دوشنبه 08 مرداد 1386, 21:23 عصر
سلام،

ماکرو با define# تعریف می شه عزیز برادر. راستش منم الان روی کامپیوتر شخصیم VS 2003 دارم چون ویندوزم XP SP1 هست. واسه همینم نمی تونم تست کنم بهتون بگم. ولی اگه هشداری که می گید همونی باشه که من فکر می کنم، ماکرو توی هشداره اومده. حالا اگه تا فردا صبر کنید، من تو شرکت VS 2005 دارم، تست می کنم، بهتون می گم.

HAIdle
دوشنبه 08 مرداد 1386, 23:20 عصر
صبر می کنیم!!
بسیار بسیار ممنون از لطف شما

saeedIRHA
سه شنبه 09 مرداد 1386, 05:07 صبح
سلام،
بجای توابع ()strcpy و ()sprintf از ()strcpy_s و ()sprintf_s استفاده کنید!
"s_" در اینجا به معنای Safe هست، این کار هم به این دلیل انجام شده که خیلی
از ضعف های امنیتی که در برنامه ها بوجود میامدن بخاطر همین توابع بوده!
مثلاً استفاده از ()strcpy ممکنه برنامیه شما رو به باگ Buffer Overrun سوق بده!
که هدف Microsoft با این کار جلوگیری از این قبیل باگ ها هست.
گر چه که اگر option /GS در کمپایلر Enable باشه ، فک نمیکنم بشه از این باگ ها
سوء استفاده کرد (تا اونجا که من اطلاع دارم)
موفق باشید

Inprise
سه شنبه 09 مرداد 1386, 07:37 صبح
بجای اینکه صبر بکنی میتونستی از MSDN استفاده کنی !

#pragma warning ( disable : 4996 )
// functions like strcpy are now deprecated for security reasons; this disables the warning

sh_roohani
چهارشنبه 10 مرداد 1386, 00:05 صبح
سلام،

شما احتمالا خروجی مثل این می گیرین:

Compiling...
main.cpp
d:\c++ projects\test\test\main.cpp(9) : warning C4996: 'strcpy' was declared deprecated
d:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'
Linking...
Embedding manifest...


درسته؟ خوب. ببینین مثلا برای این مورد خاص خودش گفته ماکروی
_CRT_SECURE_NO_DEPRECATE رو تعریف کنین. شما می تونین تو قسمت Preprocessor پروژه تون یا مثلا تو stdafx این ماکرو رو تعریف کنین و دیگه این هشدار رو نگیرین. چند مورد دیگه هم مثل این هست که کامپایلر خودش بهتون می گه چه ماکرویی تعریف کنین.

در ضمن اون موردی که دوستمون saeedIRHA (http://barnamenevis.org/forum/member.php?u=8702) فرمودن هم درسته، اما شما می تونین با دقت بیشتری از توابع کتابخانه استاندارد C استفاده کنین و کدتون رو portable نگه دارین و در عین حال به مشکلاتی مثل buffer overflow بر نخورین. تازه کلاس string کتابخانه استاندارد ++C هم هست که کلی از این مشکلات رو با overload کردن عملگر = حل کرده.