2016-08-15 2 views
-1

내 자신의 OS를 작성 중이며 자체 malloc realloc 기능을 구현해야했습니다. 그러나 내가 쓴 것은 안전하지 않을 수도 있고 변수가 실제로 파괴되지 않기 때문에 메모리 누수가 발생할 수도 있으며 메모리가 0으로 설정되어 있지만 변수 이름은 여전히 ​​존재하기 때문에 메모리 누수가 발생할 수 있다고 생각합니다. 누군가이 코드에 어떤 취약점이 있는지 말해 줄 수 있습니까? 프로젝트는 github에 곧 추가되어 사용자 subado512로 완료됩니다.c malloc/realloc 함수를 올바르게 구현하는 방법은 무엇입니까?

코드 :

void * malloc(int nbytes) 
{ 
    char variable[nbytes]; 
    return &variable; 
} 
void * free(string s) { 
    s= (string)malloc(0); 
    return &s; 
} 

void memory_copy(char *source, char *dest, int nbytes) { 
    int i; 
    for (i = 0; i < nbytes; i++) { 
     *(dest + i) = *(source + i);    // dest[i] = source[i] 
    } 
} 
void *realloc(string s,uint8_t i) { 
    string ret; 
    ret=(string)malloc(i); 
    memory_copy(s,ret,i); 
    free(s); 
    return &ret; 
} 

상황에있는 코드를 사용 : 의사 코드의 비트는 가독성을

string buffstr = (string) malloc(200); 
    uint8_t i = 0; 
    while(reading) 

    { 
     buffstr=(string)realloc(buffstr,i+128); 
     buffstr[i]=readinput(); 
    } 
+0

실제 운영체제를 사용하기 전에 먼 길을 가야 할까봐 걱정됩니다. – chqrlie

+0

당신의'free()'함수가 C에 대한 당신의 이해에 자신감을 불어 넣지는 않습니다. – EOF

+0

맞아요, 나도 몰라, 더 높은 수준의 언어로 프로그래밍하기 시작했습니다. C++ 만 있기 때문에 c를 알 수 있습니다. 그것이 OS이기 때문에 나는 c를 사용해야한다. 내가 골란이나 그와 비슷한 것을 사용할 수 있기를 바랍니다. – subado512

답변

1

당신이 정의되지 않은 당신의 malloc에 의해 반환 된 포인터를한다 사용에 대한 동작을 증가 : 자동 저장 기간이있는 배열의 주소를 반환합니다.

거친 시작으로 staticchar 배열을 사용하여 메모리 풀을 모델링 한 다음이 부분을 호출자에게 반환하는 것이 좋습니다. 현재 사용중인 배열의 테이블을 작성합니다. void* 유형의 정렬 요구 사항을 충족하도록하려면 맞춤으로으로 영리한 작업을 수행해야합니다. free은 그 테이블에있는 레코드를 릴리스하는 것 이상입니다.

일반적인 C 런타임 라이브러리에서 사용하는 메모리 관리 시스템은 매우 정교합니다. 이를 염두에두고, 당신의 착수가 좋은 프로그래밍 연습 그 이상이 될 수 있음을 알아 두십시오.

+0

저장 기간이 할당되지 않은 char 배열은 문자 유형에 의해서만 별칭이 지정됩니다. 다시 말해서, 그것은 임의의 메모리로 사용될 수 없으며 사용할 수 없습니다. – 2501

+0

@ 2501 : 그것은 모든 유형의 사실입니다 ... 당신은 무엇을 사용하도록 제안합니까? 'static union {unsigned char c; int i; long l; 긴 long ll; 더블 d; 긴 이중 ld; void * p; void (* fun)(); } 배열 [MEMORY_POOL_SIZE];'? – chqrlie

+0

분명히 할당 된 저장 기간을 사용해야합니다. – 2501

관련 문제