programing

'메모리 스톰프'란?

newsource 2023. 1. 30. 21:59

'메모리 스톰프'란?

'기억을 짓밟는다'는 블로그 투고를 우연히 발견했습니다.

메모리(관리 코드 세계에서 태어나면 들어본 적도 없는 것)를 쉽게 제거할 수 있는 C++ 프로그램입니다.

그리고 사실 나는 그것에 대해 들어본 적이 없어!

그럼 이건 뭐야? 기억을 뭉개고 뭉개고무는 기억?언제 일어납니까?

다른 코드 조각이 충돌하는 방식으로 메모리를 사용하고 있다는 것을 깨닫지 못한 채 코드 조각이 메모리를 조작할 때 메모리는 "무디게" 됩니다.메모리를 스탬프 하는 일반적인 방법은 몇 가지 있습니다.

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

다른 하나는 메모리를 해방한 후에 메모리에 액세스 하고 있다.메모리는 다른 오브젝트에 할당할 수 있습니다.이 경우에도 문제를 나타내는 코드는 같은 주소를 취득한 새로 할당된 개체와 관련된 것으로 문제의 원인이 된 코드와는 무관할 수 있습니다.

다른 답변은 기본적으로 맞지만 예를 들어 보겠습니다.

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즉, 루프 카운터를 리셋 할 수 있습니다.

나는 그것이 기억의 "구르기"를 보여주는 좋은 예라고 생각한다.

대부분의 경우 버퍼 오버런입니다.예를 들어 다음과 같은 코드가 있습니다.

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

그 후 기억 속에 어떤 일이 일어나도 ' 밟아 뭉개버린다'buffer. 일반적으로 '구르기'는 무의식적으로 기억을 쓰는 것을 말한다.

언급URL : https://stackoverflow.com/questions/13669329/what-is-a-memory-stomp