C++ memcpy()随机崩溃
我在应用程序中使用memcpy。memcpy随机崩溃,下面是我在Watson博士文件中得到的日志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
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
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);