Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
Prown0 opened this issue Apr 27, 2024 · 14 comments
Open

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

Prown0 opened this issue Apr 27, 2024 · 14 comments
Labels
solved Question solved

Comments

@Prown0
Copy link

Prown0 commented Apr 27, 2024

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

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

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

읽어 주셔서 감사합니다.

@col000
Copy link

col000 commented Apr 27, 2024

  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().

  1. 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
Copy link
Author

Prown0 commented Apr 27, 2024

감사합니다!

@thisisWooyeol
Copy link

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

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

@m-joon-ixix
Copy link

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

@col000
Copy link

col000 commented Apr 27, 2024

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

@Prown0
Copy link
Author

Prown0 commented Apr 27, 2024

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

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

@col000
Copy link

col000 commented Apr 27, 2024

해당 내용은 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
Copy link
Author

Prown0 commented Apr 27, 2024

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
Copy link
Collaborator

@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
Copy link
Author

Prown0 commented Apr 27, 2024

감사합니다!

@m-joon-ixix
Copy link

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

@kwonsw055
Copy link
Collaborator

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

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

@m-joon-ixix
Copy link

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

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

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

다시 한번 감사드립니다.

@kwonsw055
Copy link
Collaborator

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

@kwonsw055 kwonsw055 added the solved Question solved label Apr 27, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
solved Question solved
Development

No branches or pull requests

5 participants