SORU
24 EKİM 2013, PERŞEMBE


Çatışma arasında Stanford öğretici ve GCC

Eğer aynı yerel değişkenleri ile iki fonksiyonu varsa this film (dakika 38) göre, aynı alanı kullanacak. Aşağıdaki program yani. 5 Yazdır. gcc ile derleme sonuçları -1218960859. neden?

Program:

#include <stdio.h>

void A()
{
    int a;
    printf("%i",a);
}

void B()
{
    int a;
    a = 5;
}

int main()
{
    B();
    A();
    return 0;
}

istendiği gibi, burada çözücü çıktısı:

0804840c <A>:
 804840c:   55                      push   ebp
 804840d:   89 e5                   mov    ebp,esp
 804840f:   83 ec 28                sub    esp,0x28
 8048412:   8b 45 f4                mov    eax,DWORD PTR [ebp-0xc]
 8048415:   89 44 24 04             mov    DWORD PTR [esp 0x4],eax
 8048419:   c7 04 24 e8 84 04 08    mov    DWORD PTR [esp],0x80484e8
 8048420:   e8 cb fe ff ff          call   80482f0 <printf@plt>
 8048425:   c9                      leave  
 8048426:   c3                      ret    

08048427 <B>:
 8048427:   55                      push   ebp
 8048428:   89 e5                   mov    ebp,esp
 804842a:   83 ec 10                sub    esp,0x10
 804842d:   c7 45 fc 05 00 00 00    mov    DWORD PTR [ebp-0x4],0x5
 8048434:   c9                      leave  
 8048435:   c3                      ret    

08048436 <main>:
 8048436:   55                      push   ebp
 8048437:   89 e5                   mov    ebp,esp
 8048439:   83 e4 f0                and    esp,0xfffffff0
 804843c:   e8 e6 ff ff ff          call   8048427 <B>
 8048441:   e8 c6 ff ff ff          call   804840c <A>
 8048446:   b8 00 00 00 00          mov    eax,0x0
 804844b:   c9                      leave  
 804844c:   c3                      ret    
 804844d:   66 90                   xchg   ax,ax
 804844f:   90                      nop

CEVAP
24 EKİM 2013, PERŞEMBE


Evet, evet, butanımsız davranışdeğişken başlatılmamış kullanıyorsun çünkü., ^sup>1.

Ancak, x 86 mimarisi2,bu deney çalışması gerekir. Değeri "" yığın, ve B(), aynı değer başlatıldı olmadığı için hala orada olabilir, bu çerçeveler aynı yığın sağladı. silinir değil mi

int a olmadığı için olduğunu tahmin etmek girişim isterdimkullanılırvoid B(), iç derleyici kod optimize edilmiş ve 5 asla yığında konumu için yazılmıştır. De B() 12 *bir eklemeyi deneyin - sadece çalışabilir.

Ayrıca, derleyici bayrakları - yani optimizasyon seviyesi - büyük olasılıkla bu deney de etkileyecektir. -O0 gcc geçirerek iyileştirmeleri devre dışı bırakmayı deneyin.

Düzenleme:Ben sadece gcc -O0 ile kod derlenmiş (64-bit), ve gerçekten de, bu program bir çağrı aşina beklediğiniz yığını olarak 5, yazdırır. Hatta -O0 olmadan çalıştı. Bir 32-bit yapı farklı davranabilir.

Yasal Uyarı: hiç değilhiç"gerçek" kodu! böyle bir şey kullanın

1 - tartışma below oluyor ya bu "" ya da sadece tahmin edilemez. İK resmen olup olmadığı hakkında Var

2 - Ayrıca 64 ve bir çağrı yığını kullanan tüm diğer mimarlık muhtemelen (bir ISP ile en az olanlar)


Hadi neden bir göz atınyoktuiş. Bu en iyi -m32 ile derleme yapacağım 32 bit görülüyor.

$ gcc --version
gcc (GCC) 4.7.2 20120921 (Red Hat 4.7.2-2)

$ gcc -m32 -O0 test.c ile (iyileştirme) engelli derlenmiş. Bu çalıştırdığımda, çöp yazdırır.

$ objdump -Mintel -d ./a.out bakarak:

080483ec <A>:
 80483ec:   55                      push   ebp
 80483ed:   89 e5                   mov    ebp,esp
 80483ef:   83 ec 28                sub    esp,0x28
 80483f2:   8b 45 f4                mov    eax,DWORD PTR [ebp-0xc]
 80483f5:   89 44 24 04             mov    DWORD PTR [esp 0x4],eax
 80483f9:   c7 04 24 c4 84 04 08    mov    DWORD PTR [esp],0x80484c4
 8048400:   e8 cb fe ff ff          call   80482d0 <printf@plt>
 8048405:   c9                      leave  
 8048406:   c3                      ret    

08048407 <B>:
 8048407:   55                      push   ebp
 8048408:   89 e5                   mov    ebp,esp
 804840a:   83 ec 10                sub    esp,0x10
 804840d:   c7 45 fc 05 00 00 00    mov    DWORD PTR [ebp-0x4],0x5
 8048414:   c9                      leave  
 8048415:   c3                      ret    

B, derleyici ayrılmış 0x10 yığın alanı, [ebp-0x4] int a değişken başlatıldı 5 bayt olduğunu görüyoruz.

A ancak, derleyici [ebp-0xc] 26 *yerleştirilmiş. Bu durumda bizim yerel değişkenlervermediaynı yerde son! De A 28 *bir çağrı ekleyerek* 30 ** 31 *aynı olduğu için yığın çerçeveler ve baskı neden olur 55.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • LaKe Lightroom Tutorials

    LaKe Lightro

    22 Temmuz 2014
  • PoreoticsHD

    PoreoticsHD

    22 NİSAN 2010
  • Yanko Kral

    Yanko Kral

    8 HAZİRAN 2006