2013-05-09 5 views
11

바이트 유출이란 무엇입니까?바이트 유출이 발생하는 이유는 무엇입니까?

C 프로그램에서 생성 된 LLVM 중간 표현에서 x86 ASM을 덤프 할 때 대개 4 바이트 크기의 많은 유출이 있습니다. 나는 그들이 왜 발생하고 무엇을 성취 하는지를 알 수 없다.

그들은 오프 스택의 조각을 "컷"을 보이지만, 특이한 방법 :

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

답변

12

레지스터 유출은 레지스터 (이 비유의보다 지역 변수를 가질 때 발생 단순히 - 정말 의미는 그들이 메모리에 저장되어야한다는 것입니다). 이 명령어는 EAX 값을 저장하고 있습니다. 아마도 EAX가 malloc에 ​​의해 clobbered되고 다른 예비 레지스터를 가지고 있지 않기 때문입니다. (그리고 컴파일러가 어떤 이유로 레지스터에 상수 60이 필요하다고 결정했는지). 그것의 모양으로

, 컴파일러는 확실히 mov DWORD PTR [ESP + 60], EAX를 생략하고는 달리 mov EAX, DWORD PTR [ESP + 60]이든 EAX의 저장된 값이 그 시점에서 60 이외 될 수 있기 때문에, 사용되는 오프셋 할 경우 대신 mov EAX, 60을 반복 할 수있다. 그러나 컴파일이 완벽하게 최적이라고 보장 할 수는 없습니다.

sub ESP, 84 이후에는 스택 크기가 조정되지 않는다는 것을 명심하십시오 (물론 호출 명령을 통해 리턴 주소를 푸시하는 경우 제외). 다음 지침에서는 ESP를 대상이 아닌 메모리 오프셋으로 사용합니다.

관련 문제