C++ memcpy()随机崩溃

C++ memcpy()随机崩溃,c++,memcpy,C++,Memcpy,我在应用程序中使用memcpy。memcpy随机崩溃,下面是我在Watson博士文件中得到的日志 100181b5 8bd1 mov edx,ecx 100181b7 c1e902 shr ecx,0x2 100181ba 8d7c030c lea edi,[ebx+eax+0xc] 100181be f3a5 rep

我在应用程序中使用memcpy。memcpy随机崩溃,下面是我在Watson博士文件中得到的日志

        100181b5 8bd1             mov     edx,ecx
        100181b7 c1e902           shr     ecx,0x2
        100181ba 8d7c030c         lea     edi,[ebx+eax+0xc]
        100181be f3a5             rep     movsd
        100181c0 8bca             mov     ecx,edx
        100181c2 83e103           and     ecx,0x3
FAULT ->100181c5 f3a4             rep     movsb  ds:02a3b000=?? es:01b14e64=00
        100181c7 ff1508450210     call    dword ptr [Debug (10024508)]
        100181cd 83c424           add     esp,0x24
        100181d0 6854580210       push    0x10025854
        100181d5 ff1508450210     call    dword ptr [Debug (10024508)]
        100181db 83c404           add     esp,0x4
下面是代码

memcpy((char *)dep + (int)sizeof(EntryRec) + (int)adp->fileHdr.keySize, data, dataSize ); 
其中:

  • dep是一种结构
  • EntryRec是一个字符指针
  • adp是一种结构
  • 在这种情况下,数据不是
    NULL
有没有人遇到过这个问题,可以帮助我

我试着调试程序, 然后我得到了下面的错误 Prog.exe(msvctd.DLL)中未处理的异常:0xC0000005:访问版本

此程序的参数传递了数据,这是无效的*

更多信息:

我已经试着在下面的区域调试代码适配器崩溃。这个函数出现在OUTPUT.c中(我认为这是一个库函数)

变量的值: p=“”(未草签)
i=2147483598

看起来您已经在缓冲区的末尾运行并生成了访问冲突


编辑:仍然没有足够的信息。如果我们不知道您试图复制到的缓冲区是如何分配的,它是否有足够的空间(我怀疑它没有),以及dataSize是否有效,我们就无法发现错误。

看起来您已经运行了缓冲区的末尾,并生成了访问冲突


编辑:仍然没有足够的信息。如果不知道如何分配您试图复制到的缓冲区(是否有足够的空间(我怀疑它没有)以及dataSize是否有效,我们就无法发现错误。

如果memcpy崩溃,通常的原因是,您传递了非法参数

请注意,使用memcpy时,源和目标可能不会重叠


在这种情况下,请使用memmove。

如果memcpy崩溃,通常的原因是您传递了非法参数

请注意,使用memcpy时,源和目标可能不会重叠


在这种情况下,请使用memmove。

有两种很可能的解释:

  • 您正在跨重叠的地址使用
    memcpy
    ——这种情况的行为尚未定义。如果您需要处理重叠地址的能力,则是“等效”工具
  • 您正在使用
    memcpy
    向程序无法访问的内存进行复制

  • 从您展示的代码来看,(2)是更可能的场景。由于可以调试源代码,请尝试在
    memcpy
    出现之前设置断点,并验证
    memcpy
    的参数是否都匹配(即
    source+num
    source>dest+num
    )。

    有两种很可能的解释:

  • 您正在跨重叠的地址使用
    memcpy
    ——这种情况的行为尚未定义。如果您需要处理重叠地址的能力,则是“等效”工具
  • 您正在使用
    memcpy
    向程序无法访问的内存进行复制

  • 从您展示的代码来看,(2)是更可能的场景。由于您可以调试源代码,请尝试在
    memcpy
    出现之前设置断点,并验证
    memcpy
    的参数是否都匹配(即
    source+num
    source>dest+num
    )。

    我建议使用memmove,因为它可以处理重叠的字符串,当在这种情况下使用memcpy时,结果是不可预测的。

    我建议使用memmove,因为它处理重叠的字符串,当在这种情况下使用memcpy时,结果是不可预测的。

    从反汇编代码中可以看出,源指针似乎不在您的地址空间中。
    代表movsb从ds:si复制到es:di。这个表示无法读取ds:si处的内存。

    从反汇编代码中可以看出,源指针不在您的地址空间中。
    代表movsb从ds:si复制到es:di。这个表示无法读取ds:si处的内存。

    从您的代码“memcpy((char*)dep+(int)sizeof(EntryRec)+(int)adp->fileHdr.keySize,data,dataSize)”和调试信息中,“data”看起来像一个局部变量(在堆栈变量上),您可以执行“data=malloc(data\u SIZE)”而不是“char data[data\u SIZE]”等操作;否则,在您当前的代码行中,“数据”已经弹出,因此可能会导致随机内存访问错误。

    从您的代码“memcpy((char*)dep+(int)sizeof(EntryRec)+(int)adp->fileHdr.keySize,data,dataSize)”和调试信息中,“data”看起来像一个局部变量(堆栈上的变量),您可以执行“data=malloc(data\u SIZE)”而不是“字符数据[数据大小]”等;否则,在您当前的代码行中,“数据”已经弹出,因此可能会导致随机内存访问错误。

    (char*)dep+(int)sizeof(EntryRec)+(int)adp->fileHdr.keySize
    指向的数据是否总是至少
    dataSize

    我也遇到过类似的崩溃,可变长度字符串后来被当作固定字符串处理

    乙二醇

    其中
    fixedLength
    大于
    10
    。很明显,它们具有不同的功能,因此没有注意到长度问题。大多数情况下,这会起作用,
    dest
    将包含“一些字符串”,空值之后将是随机垃圾。在这种情况下,如果将dest视为以null结尾的字符串,您将永远不会注意到,因为在null后面看不到垃圾


    但是,如果
    ptr
    分配在内存页的末尾,则只能读取到分配内存的末尾,不能再读取。只要你读过页面的末尾,操作系统就会正确地使你的程序崩溃。

    (char*)dep+(int)sizeof(EntryRec)+(int)adp->fileHdr.keySize所指向的数据是否总是至少
    dataSize

    我也遇到过类似的崩溃,可变长度字符串后来被当作固定字符串处理

    乙二醇

    其中
    fixedLength
    大于
    10
    。显然是
    #else  /* _UNICODE */
                if (flags & (FL_LONG|FL_WIDECHAR)) {
                    if (text.wz == NULL) /* NULL passed, use special string */
                        text.wz = __wnullstring;
                    bufferiswide = 1;
                    pwch = text.wz;
                    while ( i-- && *pwch )
                        ++pwch;
                    textlen = pwch - text.wz;
                    /* textlen now contains length in wide chars */
                } else {
                    if (text.sz == NULL) /* NULL passed, use special string */
                        text.sz = __nullstring;
                    p = text.sz;
                    while (i-- && *p) //Crash points here
                        ++p;
                    textlen = p - text.sz;    /* length of the string */
                }
    
    char * ptr = strdup("some string");
    // ...
    memcpy(ptr, dest, fixedLength);