Treść książki

Przejdź do opcji czytnikaPrzejdź do nawigacjiPrzejdź do informacjiPrzejdź do stopki
Rysunek1.11.Alokacjastrukturynasterciezapomocąfunkcjimalloc,anastępnieodwołaniedoodpowiedniegoprzesunięciawotrzymanymwskaźniku
1.2.1.„Zgadywanie”wielkościiułożeniaelementówstrukturywpamięci
Jakmożnazauważyćwpowyższychprzykładach,wprzypadkuprogramu,wktórymwykorzystanostruktury,czekająnanasdwa
wyzwania:
1.Identyfikacjawielkościstrukturysytuacjajeststosunkowoprosta,jeżelipamięć,wktórejprzechowywanedane,jestdynamicznie
alokowana.Niecotrudniejjest,jeżelimamydoczynieniazlokalnąlubglobalnązmienną.
2.Poznanieukładustrukturyczyliidentyfikacjalokalizacjiposzczególnychpól.Zadanietoułatwianiecowystępowaniewieluzmiennych
zajmującychpamięć„wokolicy”naszejstruktury.
1.2.2.Rozpoznawaniebudowystrukturlokalnychiglobalnych
Wlistingu1.7znajdujesięprzykładowykodilustrującywymienionepowyżejproblemyorazetapyrozpoznania.
#include"stru.h"
voidfunc1(void){
intbefore;//rozmiar=4B
structst001local;//nieznanyrozmiar
intafter[4];//rozmiar=16B
before=0x1111;
after[0]=0x2222;
local.first=0xaaaa;
local.last=0xffff;
}
intmain(void){
func1();
return0;
}
Listing1.7.KodwjęzykuCoperującynalokalnejstrukturze
Załóżmy,żewiemy,lokalniewystępujądwiezmienneoznanymrozmiarzeorazstruktura„pomiędzy”nimi(wrozumieniuukładu
pamięci).Pierwszazmiennamawielkośćczterechbajtów(sizeof(int)),adruga16(4×sizeof(int)).Kiedyprzeanalizujemykodasemblera
wygenerowanynapodstawieprzytoczonychźródełwjęzykuC(patrzrys.1.12),możemydostrzecnastępująceetapywykonaniafunkcji
func1:
1.Alokacjamiejscanastosienazmiennelokalne,gdzie0xF0=240bajtów.Stądmożnaoszacowaćwielkośćpamięcizarezerwowanej
nastrukturę:240(4+16)=220bajtów.
2.Przypisaniestałejdozmiennejbefore.
3.Przypisaniestałejdoelementuafter[0].
4.Przypisaniestałejdopierwszegopolastruktury.Bardziejczytelnybyłbytutajzapis[ebp+var2+0x0].Przykładtenpokazuje,
żezpunktuwidzeniakoduniskopoziomowegopojęciestruktury(jakoorganizacjipamięci)nieistnieje.
5.Przypisaniestałejdoostatniegopolastruktury,znajdującegosięnaprzesunięciu0xD8.Zapistenjestwidocznytylkodlatego,
żezmiennąvar2oznaczono(wprogramiedodeasemblacji)jakotablicę220bajtównastosie.
Rysunek1.12.Kodasemblerafunkcjifunc1przedstawionejwlistingu1.7
Układpamięcinastosiefunkcjipokazanonarysunku1.13.Stosrośniewdół,więczmiennelokalneodłożonewodwrotnejkolejności.
Zmienneoznanymrozmiarzetovar1(1)orazvar3(3).Elementvar2(kandydatnaposzukiwanąstrukturę)zostałoznaczonyjakotablica
odługości220bajtów(rozmiar„odgadnięty”napodstawiepowyższejanalizymiejscazarezerwowanegonastosie).