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_tSIZE_MAX + 1,因此价值巨大。

你可以通过比较发现:

 if (dstsize > SIZE_MAX >> 1) {
     fprintf(stderr, "ft_strlcpy: huge dstsize indicates a negative value was passed: %zd\n", dstsize);
     abort();
 }