我在检查valgrind中的代码时遇到此错误:
==19985== Source and destination overlap in memcpy(0x6d3c328, 0x6d3c328, 5)
==19985== at 0x4A24F66: _intel_fast_memcpy (mc_replace_strmem.c:894)
==19985== by 0x551A6D7: kpufprow (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==19985== by 0x5517FDE: kpufch0 (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==19985== by 0x5516CB6: kpufch (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==19985== by 0x540CA2F: OCIStmtFetch2 (in /opt/oracle/product/10.2/lib/libclntsh.so.10.1)
==19985== by 0x4CDAF6E: OCI_FetchData (resultset.c:506)
==19985== by 0x4CDB405: OCI_FetchNext (resultset.c:1117)
==19985== by 0x402899: buildQotHash (c4.c:140)
==19985== by 0x4036F6: main (c4.c:469)
我正在附上代码段。它是提到的函数buildQotHash
的一部分。我标记了第140行。
OCI_Connection* cn;
OCI_Statement* st;
OCI_Resultset* rs;
if (!OCI_Initialize(err_handler, NULL, OCI_ENV_DEFAULT))
return EXIT_FAILURE;
cn = OCI_ConnectionCreate( "db", "user", "pass", OCI_SESSION_DEFAULT);
st = OCI_StatementCreate(cn);
char query[5000];
//here def of query
OCI_ExecuteStmt(st, query);
rs = OCI_GetResultset(st);
int i = 1;
int j = 0;
while (OCI_FetchNext(rs))<--- here is line 140
{}
我不想惹恼OCILIB
。我可以在lib外面修复它吗?
答案 0 :(得分:0)
memcpy不支持重叠的内存区域。如果您不能保证区域不重叠,请使用memmove。
答案 1 :(得分:0)
你实际上没有问过一个问题,但我认为问题是'为什么?'。
kpufprow正在调用 memcpy
。你需要它的来源来确定原因。
请注意许多现代memcpy
实现(包括,我相信,现代gcc一个,但不要依赖它)确实允许重叠的src&amp; dest,就像memmove
一样工作。可能是图书馆知道这种情况,因此你有误报。