"메모리 스톰프"란 무엇입니까?


95

방금 "기억을 뛰어 넘는 "에 대해 언급 한이 블로그 게시물 을 보았습니다.

메모리를 쉽게 밟을 수있는 C ++ 프로그램 (관리되는 코드 세계에서 태어났다면 들어 보지 못한 것)

사실 저는 들어 본 적이 없습니다!

그래서, 이것은 무엇입니까, 기억 쿵쾅 거리는 기억? 언제 발생합니까?


4
메모리 스톰의 좋은 예는이 질문 : stackoverflow.com/questions/31016660/...
필립 팡안

답변:


117

메모리는 다른 코드가 충돌하는 방식으로 해당 메모리를 사용하고 있음을 인식하지 못한 채 코드 조각이 메모리를 조작 할 때 "위장"됩니다. 기억을 밟을 수있는 몇 가지 일반적인 방법이 있습니다.

하나는 예를 들어 100 바이트의 메모리를 할당 한 다음 100 번째 주소를 지나서 저장하는 것입니다. 이 기억은 완전히 다른 것을 담는 데 사용될 수 있습니다. 무언가가 밟힌 희생자에 접근하려고 할 때 문제가 나타나고 그 위에 밟힌 코드가 완전히 관련이 없을 수 있기 때문에 이것은 특히 디버깅하기가 어렵습니다.

다른 하나는 해제 된 후 메모리에 액세스하는 것입니다. 메모리는 다른 개체에 할당 될 수 있습니다. 다시 말하지만, 문제를 보여주는 코드는 동일한 주소를 갖고 문제를 일으킨 코드와는 관련이없는 새로 할당 된 객체와 관련이있을 수 있습니다.


3
다음 은 기억력 쾅쾅의 좋은 예입니다.
patryk.beza jul.

33

매우 자주 버퍼 오버런입니다. 예를 들어,이 코드 :

char buffer[8];
buffer[8] = 'a';

이후 메모리의 다음 항목에 어떤 일이 발생하든 "건조"합니다 buffer. 일반적으로 말해서 'stomping'은 의도하지 않은 메모리에 기록되는 것입니다.


9

다른 답변은 기본적으로 정확하지만 예를 들어보고 싶습니다.

int a[10], i;       
for (i = 0; i < 11 ; i++)
    a[i] = 0;

int i, a[10];     
for (i = 0; i < 11 ; i++)
    a[i] = 0;

이러한 샘플은 정의되지 않은 동작이기 때문에 무한 루프로 이어질 수 있습니다 (또는 이어지지 않을 수 있음).

i메모리의 변수 는 배열 직후에 저장 될 가능성이 높습니다 . 따라서 액세스 a[10]는 실제로 액세스 할 수 있습니다.i . 즉, 루프 카운터를 재설정 할 수 있습니다.

나는 그것이 기억 "쿵쿵"을 보여주는 좋은 예라고 생각한다.


1
다른 운영 체제에서 거의 동일한 예제를 논의하는 다른 스레드가 있습니다 ... stackoverflow.com/questions/31016660
Christian

2
@Christian OS와는 아무 관련이 없습니다. 이것은 정의되지 않은 동작입니다.
ST3 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.