[英]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.