ABA


"חידה חמודה"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #15984 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 15984
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   21:58   17.07.10   
אל הפורום  
  חידה חמודה  
 
  

#include <iostream>

using namespace std;

void f() {
int a = 5;
2[&a] -= a;
}

int main() {
f();

return 0;
}

בלי לקמפל, מה יקרה שנקמפל את התוכנית הבאה ללא אופטימיזציות, כמו שהיא בדיוק(לדוגמה, בדיבאג..) ונריץ אותה

אחרי שלא הצלחתם להבין (), תקמפלו, תדבגו, ותגידו לי מה קורה כאן
תכתבו את זה בתוך ההודעה, כדי שמי שנכנס לא יקבל ספוילר

בהצלחה
לירן.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  השערה בתגובה עם ציטוט: ldan192  17.07.10 22:38 1
     לא :) Sn00py  17.07.10 23:23 2
  השערה בלי לקמפל ולדבאג ronen333  18.07.10 00:52 3
     אממ ג'וני הקטן 18.07.10 01:36 4
         כע.. שאמרתי 2 זה ronen333  18.07.10 01:42 5
  תקמפלו - מה קורה? Sn00py  22.07.10 22:50 6
     כלום... כמו שאמרתי זה עובר קומפלציה יפה. ronen333  23.07.10 11:55 7
         לי זה התקמפל אבל זרק כול מיני שגיאות הזויות בruntime akoka2 23.07.10 12:29 8
             כנראה בגלל הקומפיילר, הוא רשם להריץ בלי אופטמיזציה D-KinG 23.07.10 12:48 9
         סבבה. ושאתה מריץ, מה קורה? Sn00py  23.07.10 13:19 10
             זורק אותי. גם כמו שאמרתי. ronen333  23.07.10 16:21 11
                 אז אתה מקמפל עם אופטימיזציות. Sn00py  23.07.10 17:10 12
                     Run-Time Check Failure #3 ronen333  23.07.10 23:17 13
                         מה? Sn00py  24.07.10 12:00 14
                             שמע אני גם מקמפל את זה בdebug (בVS 2010..) ג'וני הקטן 24.07.10 14:20 15
                                 הנה גירסה מקומפלת שלי Sn00py  24.07.10 15:02 16
                                     הםם, שכחתי מהאשכול הזה בכלל. לאחר חישובים נוספים: ldan192  24.07.10 16:57 17
                                         נייס... ronen333  24.07.10 17:34 19
                                             בX86 כמו של כולנו, זה תמיד נכון :) Sn00py  24.07.10 17:41 20
                                                 לי האמת זה על 64 :P ronen333  24.07.10 18:00 25
                                                     זה x86_32 מול x86_64. לשתיהן סט פקודות זהה ldan192  24.07.10 18:04 26
                                                         אה.. אז זה תמיד זהה? ronen333  24.07.10 18:06 27
                                         יפה מאוד :) תשובה נכונה Sn00py  24.07.10 17:41 21
                                             מגניב :] אהבתי את החידה. מעניין איך זה מתבטא באמת בדיבאגר ldan192  24.07.10 17:46 22
                             אני אמרתי שאני לא יודע למה זה כותב את זה ronen333  24.07.10 17:28 18
                                 בטח בגלל אופטימיזציות של הקומפיילר. הוא יכול להכניס ldan192  24.07.10 17:47 23
                                     יש מצב :) ronen333  24.07.10 17:49 24

       
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   22:38   17.07.10   
אל הפורום  
  1. השערה בתגובה עם ציטוט:  
בתגובה להודעה מספר 0
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   23:23   17.07.10   
אל הפורום  
  2. לא :)  
בתגובה להודעה מספר 1
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   00:52   18.07.10   
אל הפורום  
  3. השערה בלי לקמפל ולדבאג  
בתגובה להודעה מספר 0
 
   קודם כל נתרגם את ה2[&a].
זה מקביל ל-

*(2+&a)

זה אומר הכתובת של המשתנה a פלוס 2. (מה זה אומר.. אין לדעת).
ולהפחית מימנו 5.

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


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ג'וני הקטן
חבר מתאריך 24.6.10
1166 הודעות, דרג אמינות חבר זה
   01:36   18.07.10   
אל הפורום  
  4. אממ  
בתגובה להודעה מספר 3
 
   אממ יש מצב שזה מתורגם לזה (גם לא ניסיתי לקמפל..)
אבל צריך לזכור מה מתבצע שניגשים לתא במערך...
התירגום הוא:

&arr + i*sizeof(arr)

ז"א שאם זהו מערך של INT אז זה עובד 4 בתים בכל קפיצה...
עכשיו השאלה היא מה הוא יעשה פה... אם זה מתייחס ככה ל"2" כגודל של בית אז זה בעצם יגש ל2 בתים האחרונים בa... ומפחית מזה 5
אנערף אין לי מושג אני סתם זורק באוויר אבל יש לי הרגשה שזה מה שהבחור מתכוון שקורה משהו מעניין :\


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   01:42   18.07.10   
אל הפורום  
  5. כע.. שאמרתי 2 זה  
בתגובה להודעה מספר 4
 
   כפול כמות הבתים של אינטג'ר.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   22:50   22.07.10   
אל הפורום  
  6. תקמפלו - מה קורה?  
בתגובה להודעה מספר 0
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   11:55   23.07.10   
אל הפורום  
  7. כלום... כמו שאמרתי זה עובר קומפלציה יפה.  
בתגובה להודעה מספר 6
 
   גם בדקתי עכשיו :P


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
akoka2

דרג אמינות חבר זה
   12:29   23.07.10   
אל הפורום  
  8. לי זה התקמפל אבל זרק כול מיני שגיאות הזויות בruntime  
בתגובה להודעה מספר 7
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
D-KinG
חבר מתאריך 8.6.02
3490 הודעות, דרג אמינות חבר זה
   12:48   23.07.10   
אל הפורום  
  9. כנראה בגלל הקומפיילר, הוא רשם להריץ בלי אופטמיזציה  
בתגובה להודעה מספר 8
 
   לי בכ"א זה נותן
warning C4700: uninitialized local variable 'a' used


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   13:19   23.07.10   
אל הפורום  
  10. סבבה. ושאתה מריץ, מה קורה?  
בתגובה להודעה מספר 7
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   16:21   23.07.10   
אל הפורום  
  11. זורק אותי. גם כמו שאמרתי.  
בתגובה להודעה מספר 10
 
   אתה פשוט מנסה לשנות תא זכרון שאין לך אפשרות לכתוב עליו, אז המערכת הפעלה זורקת אותך.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   17:10   23.07.10   
אל הפורום  
  12. אז אתה מקמפל עם אופטימיזציות.  
בתגובה להודעה מספר 11
 
   אם תקמפל בלי אופטימיזציות ותריץ ב DEBUG(לא בRELEASE!), התוכנית "תתקע". אותי מעניין לדעת - למה היא נתקעת.. או יותר נכון - לא נגמרת לעולם.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   23:17   23.07.10   
אל הפורום  
  13. Run-Time Check Failure #3  
בתגובה להודעה מספר 12
 
   Run-Time Check Failure #3 - The variable 'a' is being used without being initialized.

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

אם זה משהו אחר אשמח שתשפוך בפנינו את הסיבה, כפי שאתה מסביר יפה כל שבוע .


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   12:00   24.07.10   
אל הפורום  
  14. מה?  
בתגובה להודעה מספר 13
 
   איך מה שכתבת הגיוני בכלל? חח אנחנו מאתחלים את A.

בכל מקרה הפעם אני מעדיף לא לכתוב פתרון, עד שמישהי ימצא אותו.
בקימפול ללא בדיקות וללא אופטימיזציות, המצב שיקרה הוא שהתוכנית לא תסיים לעולם(כמו תתקע, רק לא באמת תתקע). ואותי מעניין - למה?

תפתחו OllyDbg או WinDbg ותראו מה קורה זה ממש יפה.

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ג'וני הקטן
חבר מתאריך 24.6.10
1166 הודעות, דרג אמינות חבר זה
   14:20   24.07.10   
אל הפורום  
  15. שמע אני גם מקמפל את זה בdebug (בVS 2010..)  
בתגובה להודעה מספר 14
 
   והוא עף לי... עם ACCESS VIOLATION... הוא מביא קודם כל הודעות אחרות (מוזרות) ואז פשוט זורק לי ACCESS VIOLATION... אבל רק בסוף התוכנית... זאת הכוונה שלך??
אם זאת הכוונה תגיד ואני יכנס לOLLY... אנלא רוצה סתם להיכנס לזה אם זה לא המצב שצריך להגיע אליו...
מה שמוזר זה ששאני מקפל את זה כRELEASE אז הוא לא עף בכלל חחח...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   15:02   24.07.10   
אל הפורום  
  16. הנה גירסה מקומפלת שלי  
בתגובה להודעה מספר 15
 
   בלי אף אוטימיזציה או RUNTIME CHECK,
בדיוק הקוד שכתבתי למעלה
מקומפל בדיבאג

לא אמור לעוף. אמור פשוט לעבוד לנצח. למה זה קורה?

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   16:57   24.07.10   
אל הפורום  
  17. הםם, שכחתי מהאשכול הזה בכלל. לאחר חישובים נוספים:  
בתגובה להודעה מספר 16
 
2[&a] מצביע בעצם למיקום שבמחסנית בו מאוחסן &a + 0x2.
מכיוון שהמחסנית גדלה אל הכתובות הנמוכות (אחורה) ויש לנו משתנה מקומי יחיד (בלי ארגומנטים לפונקציה) - משמע בעצם שאנחנו מקטינים את ה-ebp המאוחסן במחסנית ב-5 ובכך מצביעים לכתובת מייד לפני הקריאה ל-f.

בצורה זו יוצרים רקרוסיה אינסופית שדורסת כל הזמן את הערכים של עצמה.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   17:34   24.07.10   
אל הפורום  
  19. נייס...  
בתגובה להודעה מספר 17
 
  

לא חשבתי על האפשרות לחשב כמה זה אחורה במחסנית ושזה יגרום לרקורסיה.
יפה עידן

אם כי זה לא נכון תמיד.. תלוי במחשב.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   17:41   24.07.10   
אל הפורום  
  20. בX86 כמו של כולנו, זה תמיד נכון :)  
בתגובה להודעה מספר 19
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   18:00   24.07.10   
אל הפורום  
  25. לי האמת זה על 64 :P  
בתגובה להודעה מספר 20
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   18:04   24.07.10   
אל הפורום  
  26. זה x86_32 מול x86_64. לשתיהן סט פקודות זהה  
בתגובה להודעה מספר 25
 
(רק שהורחב ל-64 ביט).


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   18:06   24.07.10   
אל הפורום  
  27. אה.. אז זה תמיד זהה?  
בתגובה להודעה מספר 26
 
   נכון, כבר אמרנו שזה נתן את השגיאה הזאת בגלל האופטמזציה :|.. בלאט.


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
Sn00py 
חבר מתאריך 1.8.02
2954 הודעות, דרג אמינות חבר זה
   17:41   24.07.10   
אל הפורום  
  21. יפה מאוד :) תשובה נכונה  
בתגובה להודעה מספר 17
 
  

\x6C\x65\x65\x74\x68\x61\x78\x30
\x72\x3A\x2D\x29
tresp4sser


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   17:46   24.07.10   
אל הפורום  
  22. מגניב :] אהבתי את החידה. מעניין איך זה מתבטא באמת בדיבאגר  
בתגובה להודעה מספר 21
 


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   17:28   24.07.10   
אל הפורום  
  18. אני אמרתי שאני לא יודע למה זה כותב את זה  
בתגובה להודעה מספר 14
 
   אבל זה כותב.. מה אתה רוצה להתווכח עם עובדות? חחח


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ldan192 
חבר מתאריך 14.9.08
95119 הודעות
   17:47   24.07.10   
אל הפורום  
  23. בטח בגלל אופטימיזציות של הקומפיילר. הוא יכול להכניס  
בתגובה להודעה מספר 18
 
את הפונקציה inline כשהיא כל-כך קצרה ואז בעצם אתה דורס משתנים אחרים.


בברכה,
עידן


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
ronen333 
חבר מתאריך 20.2.03
6069 הודעות, דרג אמינות חבר זה
   17:49   24.07.10   
אל הפורום  
  24. יש מצב :)  
בתגובה להודעה מספר 23
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net