מדוע אני מקבל את ה-warning הזה ?

  • פותח הנושא ocp1
  • פורסם בתאריך

ocp1

New member
מדוע אני מקבל את ה-warning הזה ?

התוכנה המצורפת תיצור לוח כפל בגודל MaxMult X MaxMult. בעת קומפילציה מופיע לי ה- warning הבא : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
 

vinney

Well-known member
איזה קומפיילר זה?

פונקציה scanf אכן לא תמיד בטוחה, ויכולה להוות בעיה עם מחרוזות, או עם אתה טועה בפוינטרים, אבל פה שוב, זה נכון להרבה פונקציות של C
אני לא רואה בעיה מיוחדת בקוד שלך...
 

ocp1

New member
אני משתמש ב- visual c++ express

גירסת ה-express עם ה-SP. כששיניתי את הקוד, לפי "ההמלצה" ל- scanf_s הודעת האזהרה נעלמה, למרות שאני באמת לא מבין למה השגיאה הזאת נוצרת. מה בכלל ההבדל בין scanf ל- scanf_s ? תאמין לי, הייתי הרבה יותר מרוצה כשעבדתי עם cin ו cout...
 
ההבדל הוא שב scanf אין לך שליטה על מה שהמשתמש מכניס, והוא יכול להכניס קלט גדול מדי ולגרום לתוכנית שלך לחרוג מהקצאות הזיכרון שלה (במיוחד אם אתה משתמש ב scanf לקלוט מחרוזות).
 

vinney

Well-known member
לא ממליץ לך להשתמש בפונקציות פרטיות

של מייקרוסופט. במקום לעשות scanf יותר בטוח לעשות fgets+sscanf.
 
זה Visual Studio 2005 בקומפיילר האחרון של מיקרוסופט, הוא מזהיר מפני שימוש בפונקציות ספריה לא בטוחות. הבעיה היא שבמקום להפנות לפונקציות ספריה סטנדרטיות אחרות שהן כן בטוחות, הוא מפנה לפונקציות לא סטנדרטיות. אפשר די בשקט להתעלם (או לבטל) את ה warnings האלו.
 
זה בסדר...../images/Emo26.gif

זה לא אתה - זה הוא... (-: פשוט תבטל את ה-warning הזה (4996). משום-מה הוא level 1 אם אני לא טועה, והוא יצעק לך גם על strlen, strncpy, memcpy וכיו"ב... מייקרוסופט מנסים לדחוף את ההצעה שלהם לפונקציות בטוחות יותר: scanf_s, strncpy_s, memcpy_s וכו' (ה-s הוא בשביל secure כנראה). לא שאני לא חושב שהם צודקים במקרה הזה... אבל לקבל ממיקרוסופט הטפות לגבי security... נו שויין... שיהיו בריאים...
 

selalerer

New member
../images/Emo6.gif הצחקת אותי, אבל אני דווקא אצא

להגנת המפלצת. עבור VC2005 (והגרסאות שעוד יצאו) הם שכרו את אחד האנשים היותר פעילים בתקינה של ++C (לא יודע את שמו) ואכן ה-2005 צמוד מאוד לתקן. ייתכן שהנסיון הזה לדחוף את s_ (ואת זה אני לא יודע) הוא אולי בא מכיוון הבחור הזה.
 
בשביל זה אני פה...../images/Emo8.gif

רק להבהרה - אני בעד ה-s_ האלה - בכיף הייתי משתמש בהם, ואני יודע שמייקרוסופט עושים מאמצים שזה יכנס כתקן (ISO/IEC TR 24731) ואני מאוד אשמח אם אלה יהיו פונקציות קיימות בכל סביבה וקומפיילר - אבל הבעיה שכרגע זה לא המצב... גם אנחנו עוברים בימים אלה ל-VC2005, וכשבקומפילציה עלו 300 ומשהו warning-ים מהסוג הזה - הקדשתי קצת זמן לברר למה הקומפיילר נכנס להיפר-וונטילציה... אז קראתי, הסכמתי עם הרציונל (שהוא לא סתם איזה שגעון מייקרוסופטי): https://buildsecurityin.us-cert.gov/daisy/bsi/articles/knowledge/coding/317.html אבל הבעיה שלי היא שהקוד שלי צריך להיות פוטבילי++... הוא אמור להתקמפל על 3 מערכות-הפעלה שונות ועל לפחות 5 קומפיילרים שונים - ומה לעשות... לא כולם מחבבים את הסיפור של ה-s_...
 
למעלה