2016-06-10 2 views
-1

C++ 프로그래머를 연습하는 몇 가지 트릭이 있는데, "스코프 가드"와 같은 것일 수도 있고 임시 오브젝트에 대한 참조를 포함 할 수도 있습니다.C++에서 호출자의 스택을 제거하는 좋은 방법이 있습니까?

저는 C++ 프로그래머가 아니지만 제 3 자 라이브러리가 호출자의 스택을 어떻게 든 손상시킬 수있는 방법이 있는지 (호기심에 대해) 묻고 싶습니다. 어쩌면 갑작스런 소멸자 또는 일종의 다른 스코프 된 평생 마법과 관련된 것일까 요?

+1

확실히 제 3 자 라이브러리는 호출자의 스택을 쉽게 날려 버릴 수 있습니다. 버그 코드를 작성하는 데 많은 기술이 필요하지 않습니다. 진짜 기술은 버그가없는 코드를 작성하는 데 있습니다. 그것은 까다로운 부분입니다. –

+0

'exit (0)'은 스택 (그리고 다른 것)을 파괴하는 경향이 있습니다. 나는 이것이 정말로 좋은 질문이라고 생각하지 않는다. – MSalters

+0

@MSalters 피드백에 감사드립니다. 질문을 닫으십시오. 내 원래의 의도는 반환 된 임시 및 소멸자 등에 대한 참조에 관한 것이 었습니다. – rostamn739

답변

3

방법 타사 라이브러리는 호출자 '스택 손상시킬 수

때마다 세 번째 부분은 라이브러리 실행에서 코드 - 여부를 동적으로로드 된 OS 로더가 전화를 알고 라이브러리, 또는에 대한 초기화 루틴 클라이언트 응용 프로그램 코드의 명시 적 호출 - 대개 (대부분의 OS/구현의 보안 모델에서) 클라이언트 응용 프로그램 자체와 마찬가지로 스택 (또는 다른 메모리)을 사용할 수있는 능력이 있습니다. 예 :

void library_code() 
{ 
    char x; 
    char* p = &x; 
    *(p - 2) = 23; // undefined behaviour - may do nothing or anything, 
        // but usually overwrites stack or SIGSEGVs 
    *(p + 54) = 99; // stacks might grow up or down, so may have to + or - 
        // from &x to address in-use stack memory... 
} 
+0

감사합니다! 난 똑같이 호출 스택의 특정 호출자의 지역 (또는 말, 프레임)에 적용 같아요. 스코프/수명/RAII와 관련된 예를 생각해 낼 수 있습니까? :) – rostamn739

+1

스택은 연결되지 않은 주소 영역보다는 연속적인 메모리 영역이되는 경향이 있습니다. 프레임은 현재 호출 스택의 특정 함수가 현재 사용하고있는 바이트이며, 호출 후에 복원 할 몇 가지 저장된 CPU/GPU 레지스터가있을뿐만 아니라 반환 주소와 함수 매개 변수 및 로컬 변수가옵니다 컴파일러가 스택을 둡니다. Re scope/lifetime/RAII - 모든 스택 호스트 객체의 소멸자는'this' 포인터를 통해 같은 종류의 스택을 trash 할 수 있습니다. –

관련 문제