2013-05-09 8 views
11

Co to jest wyciek bajtów?Dlaczego występują wycieki z bajtów i co one osiągają?

Po zrzuceniu ASM x86 z pośredniej reprezentacji LLVM wygenerowanej z programu C, występuje wiele wycieków, zwykle o rozmiarze 4 bajtów. Nie wiem, dlaczego one się pojawiają i co osiągają.

Wydają się „wyciąć” kawałków stosu off, ale w niezwykły sposób:

## this fragment comes from a C program right before a malloc() call to a struct. 
## there are other spills in different circumstances in this same program, so it 
## is not related exclusively to malloc() 
... 
sub ESP, 84 
mov EAX, 60 
mov DWORD PTR [ESP + 80], 0 
mov DWORD PTR [ESP], 60 
mov DWORD PTR [ESP + 60], EAX # 4-byte Spill 
call malloc 
mov ECX, 60 
... 

Odpowiedz

12

Rejestr wyciek jest po prostu to, co się dzieje, gdy masz zmienne bardziej lokalne niż rejestrów (jest to analogia - naprawdę oznacza to, że muszą być zapisane w pamięci). Instrukcja zapisuje wartość EAX, prawdopodobnie dlatego, że EAX jest zblokowany przez malloc i nie masz innego zapasowego rejestru, aby go zapisać (i z jakiegokolwiek powodu kompilator zdecydował, że potrzebuje stałej 60 w rejestrze później).

Przez wygląda na to, że kompilator mógłby z pewnością pominięto mov DWORD PTR [ESP + 60], EAX i zamiast powtórzył mov EAX, 60 gdzie byłoby inaczej mov EAX, DWORD PTR [ESP + 60] lub cokolwiek przesunięcie go stosować, gdyż zapisana wartość EAX nie może być inna niż 60 lat w tym punkcie. Jednak kompilacja nie jest gwarantowana jako idealnie optymalna.

Pamiętaj również, że po sub ESP, 84 rozmiar stosu nie jest regulowany (za wyjątkiem instrukcji wywoławczej, która oczywiście przesuwa adres zwrotny). Poniższe instrukcje wykorzystują ESP jako przesunięcie pamięci, a nie miejsce docelowe.

Powiązane problemy