방금 "기억을 뛰어 넘는 "에 대해 언급 한이 블로그 게시물 을 보았습니다.
메모리를 쉽게 밟을 수있는 C ++ 프로그램 (관리되는 코드 세계에서 태어났다면 들어 보지 못한 것)
사실 저는 들어 본 적이 없습니다!
그래서, 이것은 무엇입니까, 기억 쿵쾅 거리는 기억? 언제 발생합니까?
방금 "기억을 뛰어 넘는 "에 대해 언급 한이 블로그 게시물 을 보았습니다.
메모리를 쉽게 밟을 수있는 C ++ 프로그램 (관리되는 코드 세계에서 태어났다면 들어 보지 못한 것)
사실 저는 들어 본 적이 없습니다!
그래서, 이것은 무엇입니까, 기억 쿵쾅 거리는 기억? 언제 발생합니까?
답변:
메모리는 다른 코드가 충돌하는 방식으로 해당 메모리를 사용하고 있음을 인식하지 못한 채 코드 조각이 메모리를 조작 할 때 "위장"됩니다. 기억을 밟을 수있는 몇 가지 일반적인 방법이 있습니다.
하나는 예를 들어 100 바이트의 메모리를 할당 한 다음 100 번째 주소를 지나서 저장하는 것입니다. 이 기억은 완전히 다른 것을 담는 데 사용될 수 있습니다. 무언가가 밟힌 희생자에 접근하려고 할 때 문제가 나타나고 그 위에 밟힌 코드가 완전히 관련이 없을 수 있기 때문에 이것은 특히 디버깅하기가 어렵습니다.
다른 하나는 해제 된 후 메모리에 액세스하는 것입니다. 메모리는 다른 개체에 할당 될 수 있습니다. 다시 말하지만, 문제를 보여주는 코드는 동일한 주소를 갖고 문제를 일으킨 코드와는 관련이없는 새로 할당 된 객체와 관련이있을 수 있습니다.
매우 자주 버퍼 오버런입니다. 예를 들어,이 코드 :
char buffer[8];
buffer[8] = 'a';
이후 메모리의 다음 항목에 어떤 일이 발생하든 "건조"합니다 buffer
. 일반적으로 말해서 'stomping'은 의도하지 않은 메모리에 기록되는 것입니다.
다른 답변은 기본적으로 정확하지만 예를 들어보고 싶습니다.
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
. 즉, 루프 카운터를 재설정 할 수 있습니다.
나는 그것이 기억 "쿵쿵"을 보여주는 좋은 예라고 생각한다.