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