通过一些错误示例了解 memcpy() 的行为

Understanding behavior of memcpy() with some error examples

我正在尝试编写 memcpy 的实现。 外观如下:

void *ft_memcpy(void *s1, const void *s2, size_t n)
{
    size_t i;  
    i = 0;
    while (i < n)
    {
        ((unsigned char *)s1)[i] = ((unsigned char *)s2)[i];
        i++;
    }
    return (s1);
}

它主要工作为 string.h memcpy,除了一些错误情况:

memcpy(NULL, NULL, 256)

original memcpy returns NULL,我的版本segfault

void    test_memcpy()
{
    int  array[512] = {0};
    char byte_array[512];
    memcpy(byte_array, array, sizeof(array));
}

这里原来的memcpy结尾是zsh: abort,我的版本没问题。 这种情况会调用未定义的行为,但在一个 system/compiler 上我想它应该是相同的,但事实并非如此。谁能解释一下为什么会这样?

当您调用 undefined behavior 时,您无法预测程序的行为方式。它可能会崩溃,可能会输出奇怪的结果,或者看起来工作正常。此外,看似无关的更改(例如添加未使用的变量或调用 printf 进行调试)可能会改变未定义行为的表现方式。

test_memcpy 的情况下,memcpy 将写入到 byte_array 的末尾,因为您给它的大小太大了。如果调用 ft_memcpy 也会发生同样的情况。两者都是未定义的行为,它们不需要以相同的方式表现出来。

为前两个参数传递一个 NULL 指针也是如此。 ft_memcpy 调用未定义的行为,因为它试图取消引用两个指针。至于 memcpy,实现可能会或可能不会在执行任何操作之前检查 NULL。即使没有,也不能保证它会崩溃。