2012년 04월 14일
[C] 해지된 포인터의 메모리 침범 예
- 해지된 영역을 다른 곳에서 다시 할당 받아 사용할 경우(소스에서 des)
- 해지된 메모리를 가진 포인터(src)의 사용으로 포인터 주소가 어긋날 수 있는 몇몇 경우의 예.
- 단순히 말하면 같은 메모리 영역에 대해 다른 인터페이스로 접근하면 일어나는 것들이다.
- Ex1의 기본적인 경우이고, Ex2, 3이 유사하게 생길 수 있는 경우...
- Ex3로 비유해서 H**HT***E내의 B**K*T내의 일부 노드를 재할당되었을경우,
해지된 포인터의 접근으로 저장된 value포인터의 값이 1씩 변할 수 있음.
(보통 void형의 경우 4, 특정 구조체 형식이라면 해당 크기만큼 증가하겠지만)
* 내용과 별개가 되버렸지만 덕분에 GDB사용법은 꽤 익혔다!!!
#include "stdafx.h"
struct des {
int key;
void* value;
des* next;
};
struct src {
char* data;
int count;
bool isBlock;
};
#include <iostream>
#include <stdio.h>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// 공통적으로
// src는 메모리는 해지된 상태에서 해당 영역을 그대로 가지고 있어서 다른 곳을 침범하는 역활이고,
// des는 src이 가르키는 영역을 할당받게 되어 침범 당하는 역활이다.
src* Ex1Src = new src;
des* Ex1Des = (des*)Ex1Src;
Ex1Des->key = 0;
Ex1Des->value = (void*)0x11111111; // magic number. 할당된 포인터 대용
Ex1Des->next = NULL;
printf(" Example. 1\n");
printf(" - Before \n");
printf(" Ex1Des : %d/%p/%p \n", Ex1Des->key, Ex1Des->value, Ex1Des->next);
printf(" Ex1Src : %p/%d/%d \n", Ex1Src->data, Ex1Src->count, Ex1Src->isBlock);
Ex1Src->count++; // 메모리 침범
printf(" - After ++\n");
printf(" Ex1Des : %d/%p/%p \n", Ex1Des->key, Ex1Des->value, Ex1Des->next);
printf(" Ex1Src : %p/%d/%d \n", Ex1Src->data, Ex1Src->count, Ex1Src->isBlock);
printf("\n\n");
des* Ex2DesArray[4];
Ex2DesArray[0] = new des;
Ex2DesArray[1] = new des;
Ex2DesArray[2] = new des;
Ex2DesArray[3] = new des;
src* Ex2Src = (src*)&Ex2DesArray;
printf(" Example. 2\n");
printf(" - Before \n");
for(int i = 0; i < 4; ++i)
printf(" Ex2DesArray[%d]'s pointer : %p \n", i, Ex2DesArray[i]);
printf(" Ex2Src : %p/%d/%d \n", Ex2Src->data, Ex2Src->count, Ex2Src->isBlock);
Ex2Src->count++;
printf(" - After ++\n");
for(int i = 0; i < 4; ++i)
printf(" Ex2DesArray[%d]'s pointer : %p \n", i, Ex2DesArray[i]);
printf(" Ex2Src : %p/%d/%d \n", Ex2Src->data, Ex2Src->count, Ex2Src->isBlock);
printf("\n\n");
des* Ex3DesArray[4];
Ex3DesArray[0] = new des;
Ex3DesArray[1] = new des;
Ex3DesArray[2] = new des;
Ex3DesArray[3] = new des;
src* Ex3Src = (src*)Ex3DesArray[2];
Ex3DesArray[2]->key = 1;
Ex3DesArray[2]->value = (void*)0x11112222;
Ex3DesArray[2]->next = NULL;
printf(" Example. 3\n");
printf(" - Before \n");
printf(" Ex3DesArray[%d]'s pointer : %p - %d/%p/%d\n", 2, Ex3DesArray[2], Ex3DesArray[2]->key, Ex3DesArray[2]->value, Ex3DesArray[2]->next);
printf(" Ex3Src : %p %d %d \n", Ex3Src->data, Ex3Src->count, Ex3Src->isBlock);
Ex3Src->count++;
printf(" - After ++\n");
printf(" Ex3DesArray[%d]'s pointer : %p - %d/%p/%d\n", 2, Ex3DesArray[2], Ex3DesArray[2]->key, Ex3DesArray[2]->value, Ex3DesArray[2]->next);
printf(" Ex3Src : %p %d %d \n", Ex3Src->data, Ex3Src->count, Ex3Src->isBlock);
return 0;
}
# by | 2012/04/14 01:24 | Programming | 트랙백 | 덧글(0)











