2012-10-31 4 views
0

나는 라스베리 파이에서 스택 오버 플로우로부터 안전하게 내 C 코드를 작성하려고합니다. 나는 이것에 초심자이다 그래서 저를 위해 조금 품는다. 함수를 호출하여 바이트 수를 결정하는 한 가지 방법은 알려진 값 (예 : 0xff)을 채워 스택의 공간을 초기화하는 것입니다. 그런 다음 함수를 실행 한 다음 거꾸로 검색하여 스택의 몇 개가 알려진 값에서 변경되었는지 확인합니다. 원래의 스택 깊이와 스택 깊이를 첫 번째 변경되지 않은 값보다 먼저 취함으로써, 그 함수에 의해 사용 된 스택의 양을 결정할 수 있습니다. 나에게 합리적으로 들렸다.함수 호출 후 ARM 스택에서 사용 된 절대 바이트 수 결정?

제 문제는이 어셈블리 물건이 나에게 정말로 혼란 스럽다는 것입니다. asm()을 사용하여 내 C 코드에 ARM 어셈블리 코드를 임베드 할 수 있다고 읽었지만 스택 메모리를 초기화 한 다음 다시 돌아가서 확인하는 방법을 잘 모르겠습니다. 제가 도울 수있는 자원이 있습니까? 나는 조립에 관해서도 거의 알지 못한다. 나는 아주 훌륭한 검색어를 어떻게 짜낼 지조차 모르고있다.

감사합니다.

+0

하나의 기능에 대해 이야기하는 경우 해체를 살펴보십시오. 또한 컴파일 옵션은 스택 사용법에 따라 다릅니다. –

답변

0

난 당신이 어셈블리에서이 작업을 수행 할 필요가 있다고 생각하지 않습니다 당신이 ASM에서 아주 쉽게 할 수 있어야

void stack_init(unsigned int size) 
{ 
     int i; 
     unsigned char mem[size]; 

     for (i = 0; i < size; i++) 
       mem[i] = 0xAA; /* Best not to use 0 or all ones */ 
} 

unsigned int stack_check(unsigned int max) 
{ 
     int i; 
     unsigned char mem[max]; 

     for (i = max - 1; i >= 0; --i) { 
       if (mem[i] != 0xAA) 
         break; 
     } 
     return i + sizeof(int); 
} 
+0

큰 배열이 반드시 예측 가능한 방식으로 스택을 채울 필요가 없기 때문에이 작업을 수행하지 않는다고 생각했습니다. 인라인 어셈블리 함수로 명시 적으로이 작업을 수행해야한다고 들었습니다. 내가 틀렸다면 나를 바로 잡아라. – user1564388

+1

컴파일러가 스택이 아닌 힙에 큰 배열을 배치 할 가능성이 있습니다. 디스 어셈블리를보고 무슨 일이 일어나는지 살펴보십시오. 쓰기보다는 읽기가 훨씬 쉽습니다! 다른 코드가 최적화되어 있어도 최적화없이이 코드를 컴파일 해보십시오. – dave

2

C에서 그것을 할 수는 얼마나 깊은 안전하게 할 수있는 좋은 아이디어를 가지고 제공 이동

.globl fill_stack 
fill_stack: 
    mov r2,sp 
    mvn r3,#0 
fsloop: 
    stmdb r2!,{r3} 
    subs r0,r0,#1 
    bne fsloop 
    bx lr 

위의 C 프로토 타입

void fill_stack (unsigned int); 

이다 (당신도 인수로 그에 전달할 수 있습니다) 여기서 매개 변수는 채우려는 32 비트 단어의 수입니다.

asm을 fill_stack.s과 같은 파일에 넣고 그 파일을 컴파일러 명령 줄에 c 프로그램과 함께 추가합니다 (또는 c 컴파일러를 사용하지 않으면 객체와 링크로 별도로 어셈블합니다). 인라인 조립은 힘들고 노력의 가치가 없습니다.