Open Prown0 opened 2 months ago
mm_malloc()
의 경우 size가 0인 경우 추후 mm_free()
가능하도록 구현하시면 되십니다.
The malloc() function allocates size bytes and returns a pointer to the allocated memory. The memory is not initialized. If size is 0, then malloc() returns either NULL, or a unique pointer value that can later be successfully passed to free().
mm_free()
의 경우 ptr이 NULL인 경우 아무 동작 안하도록 하면 됩니다.
The free() function frees the memory space pointed to by ptr, which must have been returned by a previous call to malloc(), calloc(), or realloc(). Otherwise, or if free(ptr) has already been called before, undefined behavior occurs. If ptr is NULL, no operation is performed.
감사합니다!
mm_free()의 경우 ptr이 NULL인 경우 아무 동작 안하도록 하면 됩니다.
@col000 mm_driver
로 확인해본 결과 double free 상황에 대해 mm_free((nil))
이 불리는 것을 확인했습니다.
아무 동작을 안 하도록 하면 된다는 말씀이 "에러 메시지 출력을 제외하고 heap 내용을 바꾸는 동작"을 말씀하신 것이 맞을까요?
ptr = NULL 일 때 에러 메시지도 출력해야 하나요? 해야 한다면 double free와 같은 메시지로 해야 하는지도 궁금합니다.
에러 출력 형태는 자유이며, 진행 프로그램에 문제가 없으면 됩니다.
mm_malloc()
의 인자로0
이 들어오는 경우 Linux 설명서에서는malloc()
의 인자size
가0
인 경우NULL
이나, 나중에free()
의 인자가 되어도 성공적으로 작동하는 특별한 포인터를 반환한다고 되어 있습니다.mm_malloc()
에서도 똑같이 구현하면 되는지, 아니면 오류를 출력하여야 할지 궁금합니다.mm_free()
의 인자로NULL
이 들어오는 경우 Linux 설명서에서는free()
의 인자ptr
가NULL
인 경우 어떤 실행도 하지 않는다고 되어 있습니다. 그런데README
에서는 그러한 설명이 없어서NULL
인 경우에 오류를 출력하여야 할 것 같은데, 둘 중 어느 방식으로 구현하여야 할지 궁금합니다.
죄송하지만 확인차 다시 질문 드립니다. 앞의 두 경우에 대하여 대답하여 주신 대로 구현하되, 오류 메시지도 출력하여야 된다는 말씀이신가요?
해당 내용은 README 참고 부탁드립니다.
mm_free()
The
void mm_free(void *ptr)
routine frees the block pointed to byptr
that was returned by an earlier call tomm_malloc()
,mm_calloc()
, ormm_realloc()
and has not yet been freed. When when the callee tries to free a freed memory block, an error is printed.
NULL
의 경우에는 애초에 어떤 곳도 가리키지 않는데, freed memory block이 들어왔다고 간주하여야 할까요?
README
를 읽어보면
When when the callee tries to free a freed memory block, an error is printed.
라고 되어 있는데, freed memory block을 free하는 경우(double free)에는 오류 메시지가 무조건 출력되어야 하고, 그 외의 경우(NULL
이나 이상한 위치를 가리키는 포인터 등과 같이 올바른 block을 가리키지 않는 경우)에는 오류 메시지가 필수는 아닌 것으로 이해하였습니다.
그런데 mm_driver
에서 double free를 실험하면 mm_free()
의 인자로 NULL
이 들어가는 것으로 보입니다. 그래서 정확한 설명이 필요한 것 같습니다...
@thisisWooyeol @Prown0
mm_driver
에서 같은 index에 대해 free를 두 번 호출 하는 것은 double free 상황이 아닙니다.
mm_driver
의 동작은 간략히 다음과 같이 이해하시면 됩니다:
mm_driver
에는 ptr[N]
배열이 있고, 모두 NULL
로 초기화 되어 있습니다.m index size
명령을 주면, ptr[index] = mm_malloc(size)
를 실행합니다.f index
명령을 주면, mm_free(ptr[index])
를 수행하고 ptr[index] = NULL
을 수행합니다.따라서 free 명령을 같은 index에 대해 두 번 호출하게 되면, 첫 번째 명령 이후에 포인터를 NULL로 초기화하기 때문에 double free 상황(이미 free된 포인터를 mm_free에 다시 인자로 주는 상황)이 아닌, 단순히 NULL을 mm_free에 인자로 주어 호출한 상황에 불과합니다.
그렇기에 제공된 mm_driver
하에서는 double free 상황을 만들 수 없고, double free를 테스트하시고 싶으시다면 mm_test를 수정하시어 확인해보시는 걸 추천드립니다.
감사합니다!
@kwonsw055 그렇다면 mm_free 에 파라미터로 입력된 ptr 가 NULL일때는 print를 하지 않고 아무동작도 수행하지 않는것이 맞을까요?
앞서 다른 TA분이 말씀드린 바와 같이, mm_free(NULL)의 경우에는 아무 동작도 수행하지 않으면 됩니다.
mm_free()
의 경우 ptr이 NULL인 경우 아무 동작 안하도록 하면 됩니다.
앞서 제가 질문드렸을 때, 뒤이은 답변에서 "에러 출력 형태는 자유" 라고 말씀하셨어서 혼란스러웠던게 사실입니다.
그래서 이미 mm_free(NULL)
일때 에러 메시지를 출력하도록 개발을 완료하고 테스트까지 마치고 방금 제출하기 직전이었습니다.
방금 말씀으로는 mm_free(NULL)
일 때 에러 메시지도 출력하지 않아야 하는 것 같으니, 그렇게 수정하겠습니다.
TA 분들께서 항상 시간/요일 가리지 않고 도움 주셔서 대단히 감사하게 생각하고 있습니다. 🙇 다만 해당 issue에서 혼란이 야기되었던 것은 사실이라, 이 점은 표현을 분명히 하고 넘어가려 합니다 🙏
다시 한번 감사드립니다.
혼란이 있었다면 사과드립니다.
README
내에 설명되지 않은 2가지 경우에 대하여 질문 드립니다.mm_malloc()
의 인자로0
이 들어오는 경우 Linux 설명서에서는malloc()
의 인자size
가0
인 경우NULL
이나, 나중에free()
의 인자가 되어도 성공적으로 작동하는 특별한 포인터를 반환한다고 되어 있습니다.mm_malloc()
에서도 똑같이 구현하면 되는지, 아니면 오류를 출력하여야 할지 궁금합니다.mm_free()
의 인자로NULL
이 들어오는 경우 Linux 설명서에서는free()
의 인자ptr
가NULL
인 경우 어떤 실행도 하지 않는다고 되어 있습니다. 그런데README
에서는 그러한 설명이 없어서NULL
인 경우에 오류를 출력하여야 할 것 같은데, 둘 중 어느 방식으로 구현하여야 할지 궁금합니다.읽어 주셔서 감사합니다.