Bug Chasing get_next_line - kevshouse/The-Under_C_World GitHub Wiki
sequenceDiagram
participant User
participant get_next_line
participant extract_line
participant read_buffer
participant read (syscall)
participant ft_strdup
User->>get_next_line: Call with valid fd (no_nl file)
loop Until EOF
get_next_line->>extract_line: Check static_buffer
activate extract_line
extract_line-->>get_next_line: NULL (no \n found)
deactivate extract_line
get_next_line->>read_buffer: Read more data
activate read_buffer
read_buffer->>read: Call read(fd)
activate read
read-->>read_buffer: bytes_read > 0 (data)
deactivate read
read_buffer->>read_buffer: Append to static_buffer
read_buffer-->>get_next_line: new_buffer
deactivate read_buffer
get_next_line->>get_next_line: Update static_buffer
end
get_next_line->>read_buffer: Final read attempt
activate read_buffer
read_buffer->>read: Call read(fd)
activate read
read-->>read_buffer: bytes_read = 0 (EOF)
deactivate read
read_buffer->>read_buffer: Check EOF
read_buffer-->>get_next_line: NULL
deactivate read_buffer
get_next_line->>ft_strdup: Duplicate static_buffer
activate ft_strdup
ft_strdup-->>get_next_line: line copy
deactivate ft_strdup
get_next_line->>get_next_line: Free static_buffer
get_next_line->>User: Return final line
get_next_line->>get_next_line: Set static_buffer = NULL
What in fact happens (I have a bug)
sequenceDiagram
participant Test
participant get_next_line
participant extract_line
participant read_buffer
participant ft_strdup
participant strcmp
Test->>get_next_line: First call (file contains "abc" no \n)
get_next_line->>extract_line: Check buffer
extract_line-->>get_next_line: NULL (no \n found)
get_next_line->>read_buffer: Read data
read_buffer->>read: Returns "abc"
read_buffer-->>get_next_line: Merged buffer
get_next_line->>extract_line: Try again
extract_line-->>get_next_line: NULL
get_next_line-->>Test: Returns "abc"
Test->>get_next_line: Second call (EOF)
get_next_line->>extract_line: Check buffer
extract_line-->>get_next_line: NULL
get_next_line->>read_buffer: Read again
read_buffer->>read: Returns 0 (EOF)
read_buffer-->>get_next_line: NULL
get_next_line->>ft_strdup: Duplicate buffer
Note right of get_next_line: Buffer contains ""
ft_strdup-->>get_next_line: Empty string
get_next_line-->>Test: Returns "" instead of NULL
Test->>strcmp: Compare result with NULL
Note right of strcmp: strcmp(NULL, "") crashes
strcmp--x Test: SIGSEGV