2013年2月7日 星期四

執行位址 0 的程式碼

ptr.c
 1 int main(int argc, const char *argv[])
 2 {
 3 #if 1
 4   unsigned int addr = 0;
 5   goto *addr; 
5.5  // goto *(0); 
 6 #else
 7   (*(void(*)())0)();
 8 #endif
 9   return 0;
10 }

在 C 陷阱與缺陷 (C Traps and Pitfalls) 上看到的, 令人害怕的語法。 使用 goto 就清楚多了吧!

有興趣的朋友可以更進一步看看反組譯後的組合語言, 很有趣哦!

不過使用 goto 和 function 語意是不同的:


b.c
1 int main(int argc, const char *argv[])
2 {
3   (*(void(*)())(0x22))();
4   goto *(0x20); 
5   return 0;
6 }

objdump -d a.out
 1 08048404 <main>:
 2  8048404:       55                      push   %ebp
 3  8048405:       89 e5                   mov    %esp,%ebp
 4  8048407:       83 e4 f0                and    $0xfffffff0,%esp
 5  804840a:       b8 22 00 00 00          mov    $0x22,%eax
 6  804840f:       ff d0                   call   *%eax
 7  8048411:       b8 20 00 00 00          mov    $0x20,%eax
 8  8048416:       ff e0                   jmp    *%eax
 9  8048418:       90                      nop
10  8048419:       8d b4 26 00 00 00 00    lea    0x0(%esi,%eiz,1),%esi

我實在太大意了。
call, jmp is different.

至於那個 %eiz 是什呢?
ref:
http://blog.csdn.net/unbutun/article/details/6661275

沒有留言:

張貼留言

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。