OCIlib - memcpy中的源和目标重叠

时间:2014-01-13 15:10:56

标签: c

我在检查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外面修复它吗?

2 个答案:

答案 0 :(得分:0)

memcpy不支持重叠的内存区域。如果您不能保证区域不重叠,请使用memmove。

答案 1 :(得分:0)

你实际上没有问过一个问题,但我认为问题是'为什么?'。

kpufprow正在调用

memcpy。你需要它的来源来确定原因。

请注意许多现代memcpy实现(包括,我相信,现代gcc一个,但不要依赖它)确实允许重叠的src&amp; dest,就像memmove一样工作。可能是图书馆知道这种情况,因此你有误报。