2013-05-09 28 views
11

Sự cố tràn byte là gì?Tại sao xảy ra tràn byte và chúng đạt được điều gì?

Khi tôi đổ ASM x86 từ một đại diện trung gian LLVM được tạo ra từ một chương trình C, có nhiều sự cố tràn, thường có kích thước 4 byte. Tôi không thể hiểu tại sao chúng xảy ra và những gì chúng đạt được.

Họ dường như "cắt" phần của ngăn xếp ra, nhưng theo một cách khác thường:

## 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 
... 

Trả lời

12

Một tràn đăng ký chỉ đơn giản là những gì xảy ra khi bạn có các biến địa phương hơn thanh ghi (đó là một tương tự - thực sự ý nghĩa là chúng phải được lưu vào bộ nhớ). Lệnh này tiết kiệm giá trị của EAX, có khả năng vì EAX bị nén bởi malloc và bạn không có một thanh ghi dự phòng nào khác để lưu nó vào (và vì lý do nào đó trình biên dịch đã quyết định nó cần 60 hằng trong sổ đăng ký sau).

Bởi vẻ của nó, trình biên dịch có thể chắc chắn đã bỏ qua mov DWORD PTR [ESP + 60], EAX và thay vào đó lặp đi lặp lại mov EAX, 60 nơi nó nếu không sẽ mov EAX, DWORD PTR [ESP + 60] hoặc bất cứ điều gì bù đắp nó được sử dụng, bởi vì giá trị đã lưu của EAX không thể khác hơn 60 tại thời điểm đó. Tuy nhiên, việc biên dịch không đảm bảo hoàn toàn tối ưu.

Cũng lưu ý rằng sau sub ESP, 84, kích thước ngăn xếp không được điều chỉnh (ngoại trừ lệnh gọi tất nhiên sẽ đẩy địa chỉ trả về). Các hướng dẫn sau đây đang sử dụng ESP làm bộ nhớ bù trừ, không phải đích đến.