簡體   English   中英

負輸入使程序崩潰

[英]Negative input crashes program

我有以下 function:

char    *ft_substr(char const *s, unsigned int start, size_t len)
{
    char    *substr;

    if (!s)
        return (NULL);
    if (start > ft_strlen(s))
        len = 0;
    if (start <= ft_strlen(s) && s[start] != '\0')
    {   
        if (ft_strlen(s + start) < len)
            len = ft_strlen(s + start);
    }
    substr = (char *)malloc(sizeof(*s) * (len + 1));
    if (!substr)
        return (NULL);
    if (len == 0)
        return (substr);
    ft_strlcpy(substr, s + start, len + 1); 
    return (substr);
}

一些功能是自制的(strlen = ft_strlen 等)。

問題:如果我為“開始”傳遞 -1,我的程序會出現段錯誤,因為它被轉換為 4.294.967.295。 所以它在傳入時崩潰,我的 function 身體甚至沒有執行,使所有保護措施都無用。 更奇怪的是,如果我在我的 Mac 上執行此操作,一切正常,但在 Ubuntu 22.04 上卻沒有。

有什么建議么? 我不允許更改 function 原型。

編輯:我必須通過一系列測試,而以下測試我經常失敗:

Error in test 4: ft_substr("hola", 4294967295, 0): Segmentation fault!

(測試實際輸入-1)。

此外,我不允許包含測試用戶輸入的主要內容。

編輯 2:我的 main 很簡單,只需調用 function 輸入“hola”,-1、3

您需要使用'\0'終止使用ft_strlcpy復制的字符串。 您的邊界檢查也可以變得更簡單一些。

例子:

char *ft_substr(char const *s, unsigned int start, size_t len)
{
    if (!s) return NULL;

    size_t slen = ft_strlen(s);
    
    if (start > slen) {                 // start out of bounds, make empty string
        start = 0;
        len = 0;
    } else if(start + len > slen) {     // len is too large, shrink it
        len = slen - start;
    }

    char *substr = malloc(len + 1);
    if (!substr) return NULL;
    
    ft_strlcpy(substr, s + start, len); // note: copy len, not len+1
    substr[len] = '\0';                 // terminate the string
    
    return substr;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM