SNU-ARC / 2024_spring_sysprog_Lab3

8 stars 0 forks source link

`README` 내에 설명되지 않은 경우의 처리에 대한 질문 #32

Open Prown0 opened 2 months ago

Prown0 commented 2 months ago

README 내에 설명되지 않은 2가지 경우에 대하여 질문 드립니다.

  1. mm_malloc()의 인자로 0이 들어오는 경우 Linux 설명서에서는 malloc()의 인자 size0인 경우 NULL이나, 나중에 free()의 인자가 되어도 성공적으로 작동하는 특별한 포인터를 반환한다고 되어 있습니다. mm_malloc()에서도 똑같이 구현하면 되는지, 아니면 오류를 출력하여야 할지 궁금합니다.

  2. mm_free()의 인자로 NULL이 들어오는 경우 Linux 설명서에서는 free()의 인자 ptrNULL인 경우 어떤 실행도 하지 않는다고 되어 있습니다. 그런데 README에서는 그러한 설명이 없어서 NULL인 경우에 오류를 출력하여야 할 것 같은데, 둘 중 어느 방식으로 구현하여야 할지 궁금합니다.

읽어 주셔서 감사합니다.

col000 commented 2 months ago
  1. 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().

  2. 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.

Prown0 commented 2 months ago

감사합니다!

thisisWooyeol commented 2 months ago

mm_free()의 경우 ptr이 NULL인 경우 아무 동작 안하도록 하면 됩니다.

@col000 mm_driver로 확인해본 결과 double free 상황에 대해 mm_free((nil))이 불리는 것을 확인했습니다. 아무 동작을 안 하도록 하면 된다는 말씀이 "에러 메시지 출력을 제외하고 heap 내용을 바꾸는 동작"을 말씀하신 것이 맞을까요?

m-joon-ixix commented 2 months ago

ptr = NULL 일 때 에러 메시지도 출력해야 하나요? 해야 한다면 double free와 같은 메시지로 해야 하는지도 궁금합니다.

col000 commented 2 months ago

에러 출력 형태는 자유이며, 진행 프로그램에 문제가 없으면 됩니다.

Prown0 commented 2 months ago
  1. mm_malloc()의 인자로 0이 들어오는 경우 Linux 설명서에서는 malloc()의 인자 size0인 경우 NULL이나, 나중에 free()의 인자가 되어도 성공적으로 작동하는 특별한 포인터를 반환한다고 되어 있습니다. mm_malloc()에서도 똑같이 구현하면 되는지, 아니면 오류를 출력하여야 할지 궁금합니다.
  2. mm_free()의 인자로 NULL이 들어오는 경우 Linux 설명서에서는 free()의 인자 ptrNULL인 경우 어떤 실행도 하지 않는다고 되어 있습니다. 그런데 README에서는 그러한 설명이 없어서 NULL인 경우에 오류를 출력하여야 할 것 같은데, 둘 중 어느 방식으로 구현하여야 할지 궁금합니다.

죄송하지만 확인차 다시 질문 드립니다. 앞의 두 경우에 대하여 대답하여 주신 대로 구현하되, 오류 메시지도 출력하여야 된다는 말씀이신가요?

col000 commented 2 months ago

해당 내용은 README 참고 부탁드립니다.

mm_free()

The void mm_free(void *ptr) routine frees the block pointed to by ptr that was returned by an earlier call to mm_malloc(), mm_calloc(), or mm_realloc() and has not yet been freed. When when the callee tries to free a freed memory block, an error is printed.

Prown0 commented 2 months ago

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이 들어가는 것으로 보입니다. 그래서 정확한 설명이 필요한 것 같습니다...

kwonsw055 commented 2 months ago

@thisisWooyeol @Prown0 mm_driver에서 같은 index에 대해 free를 두 번 호출 하는 것은 double free 상황이 아닙니다.

mm_driver의 동작은 간략히 다음과 같이 이해하시면 됩니다:

  1. mm_driver에는 ptr[N] 배열이 있고, 모두 NULL 로 초기화 되어 있습니다.
  2. m index size 명령을 주면, ptr[index] = mm_malloc(size)를 실행합니다.
  3. 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를 수정하시어 확인해보시는 걸 추천드립니다.

Prown0 commented 2 months ago

감사합니다!

m-joon-ixix commented 2 months ago

@kwonsw055 그렇다면 mm_free 에 파라미터로 입력된 ptr 가 NULL일때는 print를 하지 않고 아무동작도 수행하지 않는것이 맞을까요?

kwonsw055 commented 2 months ago

앞서 다른 TA분이 말씀드린 바와 같이, mm_free(NULL)의 경우에는 아무 동작도 수행하지 않으면 됩니다.

  1. mm_free()의 경우 ptr이 NULL인 경우 아무 동작 안하도록 하면 됩니다.
m-joon-ixix commented 2 months ago

앞서 제가 질문드렸을 때, 뒤이은 답변에서 "에러 출력 형태는 자유" 라고 말씀하셨어서 혼란스러웠던게 사실입니다.

그래서 이미 mm_free(NULL) 일때 에러 메시지를 출력하도록 개발을 완료하고 테스트까지 마치고 방금 제출하기 직전이었습니다. 방금 말씀으로는 mm_free(NULL) 일 때 에러 메시지도 출력하지 않아야 하는 것 같으니, 그렇게 수정하겠습니다.

TA 분들께서 항상 시간/요일 가리지 않고 도움 주셔서 대단히 감사하게 생각하고 있습니다. 🙇 다만 해당 issue에서 혼란이 야기되었던 것은 사실이라, 이 점은 표현을 분명히 하고 넘어가려 합니다 🙏

다시 한번 감사드립니다.

kwonsw055 commented 2 months ago

혼란이 있었다면 사과드립니다.