Taking baby-developer steps

2022.01.26. gnl과제 하는 중... 본문

Logs/학습 log

2022.01.26. gnl과제 하는 중...

Surin Lee 2022. 1. 26. 21:47

오늘 목표

  • gnl함수
    • 부분함수로 나누기
메모리 누수는 다 잡았으니, 이제 하나로 만들었던 get_next_line 함수를 부분 함수로 나누고, 부분 함수들의 name으로 break포인트를 잡아서 SIGSEGV를 먼저 잡고, KO 케이스를 잡으면 될 것 같다. 

- SIGSEGV : 현재 SIGSEGV가 나는 테스트 케이스들의 공통점은 파일의 끝(eof)직전에 개행문자'\n'가 온다는 공통점이 있다.
- KO : 구현 때부터 우려했던 stdin에서 난다. stdin에서 eof(cntrl + d)를 어떻게 탐지할지가 계속 고민이다.

오늘 한일

  • 부분함수로 나누기 -> get_next_line 함수 내에서, 이전 호출에서 버퍼에 남은 문자를 불러오거나, 남은 문자가 없었다면 curr_buffer(이번 gnl함수 호출에서 사용할 '현재 버퍼')를 새로 할당해 read() 시스템 콜을 호출 하고 나서, while()문 내에서 1.curr_buffer내에 개행문자가 존재하는 경우 (->제일 처음 나오는 개행 문자의 주소값을  찾아, 거기까지 ft_substr()으로 새로운 문자열을 할당해 a_line에 주소 값을 저장하고 break한다. 개행 문자의 위치 뒤에 남은 문자열도 새로 할당해 그 주소를 static 지역변수인 buffers[fd]에 저장하고, curr_buffer는 할당해제 한다.), 2.curr_buffer내에 개행문자가 없는 경우(-> read() 시스템호출로 다시한번 BUFFER_SIZE만큼 읽어들이고, strjoin함수를 이용해 curr_buffer의 뒤에 이번에 읽어들인 문자열을 붙인다. 이 join된 문자열을 curr_buffer에 저장하고 다시한번 while문을 돎으로서, curr_buffer내에 개행문자가 있으면 a_line을 할당하면서 while문을 탈출, 없는 경우엔 eof를 만나 거나 개행문자를 만날 때까지 계속 curr_buffer에 이어붙인다.) 이렇게 두 분기로 나뉘어서 돌게 했는데 이부분을 get_a_line()이라는 부분 함수로 나누고 싶었는데, segfault가 발생한다. 아무래도 도중에 할당문이 있다보니 넘겨주는 포인터에서 실수를 한거 같다. 

 

 


메모

'Logs > 학습 log' 카테고리의 다른 글

2022.02.01. gnl & lldb  (0) 2022.01.29
2022.01.27. gnl  (0) 2022.01.27
2022.01.25. 학습 log  (0) 2022.01.25
2022.01.24. 학습 log  (0) 2022.01.24
자료구조 3 -> 새그먼트 오류  (0) 2021.04.06
Comments