我如何让我的程序产生zsh:abort错误而不是写随机字符?

问题描述 投票:0回答:1

我正在尝试复制memcpy函数,但是当我尝试将两个参数都设置为NULL但具有大小(例如5)时,原始函数给出了中止错误,但我的程序写入了随机字符。

void    *ft_memcpy(void *dst, const void *src, size_t n)
{
    size_t      i;
    char    *d;
    char    *s;

    s = (char*)src;
    d = (char*)dst;
    i = 0;
    while (i < n)
    {
        d[i] = s[i];
        i++;
    }
    i = 0;
    return (dst);
}

int main()
{
    char dst[0];
    char src[0];
    size_t n = 5;
    printf("%s", ft_memcpy(dst, src, n));
    printf("%s\n", memcpy(dst, src, n));

    return (0);
}
c memcpy abort
1个回答
0
投票

[srcdst的大小为0,这是在C中指定灵活数组的一种方法。通常,您仅在要动态分配的结构中定义它们,例如:]]

struct buffer {
 size_t len;
 char bytes[0]
};

#define NBYTES 8
struct buffer* ptr = malloc(sizeof(struct buffer) + NBYTES);

const char* src = "hello!";
ptr->len = strlen(src);
memcpy(ptr.bytes, src, ptr->len);

基本上,索引示例中的任何这些数组都会导致缓冲区溢出(您正在访问超出数组限制的位置。)>

此参数与传递NULL作为参数之间的区别是srcdst指向有效内存(main功能堆栈)。在C语言中,缓冲区溢出没有定义的行为(未定义的行为),因此编译器可以自由执行所需的操作。如果您使用内存清理器(用-fsanitize=address编译),它将警告您有关此问题的信息,并要求您纠正错误。

我建议您使用调试器或在复制功能中添加以下打印语句:

printf("%s: src: %p, dst: %p\n", __func__, src, dst);

请参见Array of zero length

© www.soinside.com 2019 - 2024. All rights reserved.