Libc 上原始 strlcpy 函数的实现
Implement of original strlcpy function on Libc
#include <stdio.h>
#include <string.h>
size_t ft_strlcpy(char *dst, const char *src, size_t dstsize)
{
unsigned int i;
unsigned int dst_len;
i = 0;
dst_len = strlen(dst);
if (dstsize > 0)
{
while (src[i] != '[=10=]' && i < dstsize - 1)
{
dst[i] = src[i];
i++;
}
dst[i] = '[=10=]';
}
return (strlen(src));
}
int main(void)
{
char dst[100] = "HelloWorld!";
char dst2[100] = "HelloWorld!";
const char src[11] = "teststring";
int dstsize = -1;
printf("mine : %zu\n", ft_strlcpy(dst, src, dstsize));
printf("%s\n", dst);
printf("string.h : %zu\n", strlcpy(dst2, src, dstsize));
printf("%s\n", dst2);
return (0);
}
这段代码是我自己实现strlcpy的代码
但我有一个疑问
当 dstsize 为负数时,我的函数不打印任何错误消息。
但原始 strlcpy 打印 Tracetrap 错误(可能是 linux 中的 SIGILL。我正在使用 OS X)
我已经搜索了大部分 bsd 原始 c 库 github,但它们都和我的代码一样工作。我想知道区别。 dstsize为负数时原始strlcpy如何打印错误?
这个问题的重点是“当 dstsize 像原始函数一样是负数时,如何打印跟踪陷阱错误?(我知道它将被转换为 size_t 最大数字。)”
没有理由为 strlcpy
计算 dst
中字符串的长度:dst_len = strlen(dst);
无用且适得其反。
这是修改后的版本:
size_t ft_strlcpy(char *dst, const char *src, size_t dstsize)
{
size_t i;
i = 0;
while (i + 1 < dstsize && src[i] != '[=10=]') {
dst[i] = src[i];
i++;
}
if (i < dstsize) {
dst[i] = '[=10=]';
}
while (src[i] != '[=10=]') {
i++;
}
return i;
}
关于您的问题:
how to print trace trap error when dstsize
is a negative number?(I know it will be converted to size_t
max number.)
如果调用者传递的目标大小是负数,即:使用有符号算术产生或将产生负数的某些计算结果,它将转换为 size_t
模 SIZE_MAX + 1
,因此价值巨大。
你可以通过比较发现:
if (dstsize > SIZE_MAX >> 1) {
fprintf(stderr, "ft_strlcpy: huge dstsize indicates a negative value was passed: %zd\n", dstsize);
abort();
}
#include <stdio.h>
#include <string.h>
size_t ft_strlcpy(char *dst, const char *src, size_t dstsize)
{
unsigned int i;
unsigned int dst_len;
i = 0;
dst_len = strlen(dst);
if (dstsize > 0)
{
while (src[i] != '[=10=]' && i < dstsize - 1)
{
dst[i] = src[i];
i++;
}
dst[i] = '[=10=]';
}
return (strlen(src));
}
int main(void)
{
char dst[100] = "HelloWorld!";
char dst2[100] = "HelloWorld!";
const char src[11] = "teststring";
int dstsize = -1;
printf("mine : %zu\n", ft_strlcpy(dst, src, dstsize));
printf("%s\n", dst);
printf("string.h : %zu\n", strlcpy(dst2, src, dstsize));
printf("%s\n", dst2);
return (0);
}
这段代码是我自己实现strlcpy的代码
但我有一个疑问
当 dstsize 为负数时,我的函数不打印任何错误消息。
但原始 strlcpy 打印 Tracetrap 错误(可能是 linux 中的 SIGILL。我正在使用 OS X)
我已经搜索了大部分 bsd 原始 c 库 github,但它们都和我的代码一样工作。我想知道区别。 dstsize为负数时原始strlcpy如何打印错误?
这个问题的重点是“当 dstsize 像原始函数一样是负数时,如何打印跟踪陷阱错误?(我知道它将被转换为 size_t 最大数字。)”
没有理由为 strlcpy
计算 dst
中字符串的长度:dst_len = strlen(dst);
无用且适得其反。
这是修改后的版本:
size_t ft_strlcpy(char *dst, const char *src, size_t dstsize)
{
size_t i;
i = 0;
while (i + 1 < dstsize && src[i] != '[=10=]') {
dst[i] = src[i];
i++;
}
if (i < dstsize) {
dst[i] = '[=10=]';
}
while (src[i] != '[=10=]') {
i++;
}
return i;
}
关于您的问题:
how to print trace trap error when
dstsize
is a negative number?(I know it will be converted tosize_t
max number.)
如果调用者传递的目标大小是负数,即:使用有符号算术产生或将产生负数的某些计算结果,它将转换为 size_t
模 SIZE_MAX + 1
,因此价值巨大。
你可以通过比较发现:
if (dstsize > SIZE_MAX >> 1) {
fprintf(stderr, "ft_strlcpy: huge dstsize indicates a negative value was passed: %zd\n", dstsize);
abort();
}