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

标签 c undefined-behavior memcpy

我正在尝试编写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)

原来的memcpy返回NULL,我的版本出现段错误

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

这里的原始memcpy以zsh: abort结尾,我的版本工作正常。 这种情况会调用未定义的行为,但在一个系统/编译器上我想它应该是相同的,但事实并非如此。谁能解释一下为什么会有这种不同?

最佳答案

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

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

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

关于c - 通过一些错误示例了解 memcpy() 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47930745/

相关文章:

c - 使用 XOR 交换值

c - 如何从子进程更新共享数据?

cffi 的 foreign-alloc 与包含 defconstant 的列表

c - 程序怎么显示这么大的数字

c++ - 如果更改 const 对象是未定义的行为,那么构造函数和析构函数如何使用写访问权限进行操作?

c - AVR - AT90CAN128,随机跳转代码

c - Microsoft SDL 和 memcpy 弃用

c - C语言中 float 的取值范围

java - 像 Jazillian 这样的工具可以将 C 转换为 Java?

c - "realloc(): invalid next size"是什么意思?