2014-01-13 25 views
0

而在Valgrind的檢查代碼,我得到這個錯誤:OCILIB - 源和目標重疊,memcpy的

==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

memcpy不支持重疊的內存區域。如果你不能保證這些區域不重疊,請使用memmove。

0

你實際上沒有問過一個問題,但我假設問題是'爲什麼?'。

memcpy被kpufprow調用。您需要確定原因的來源。注意許多現代memcpy實現(包括,我相信,現代gcc之一,但不在那上面)允許重疊dest,即像memmove這樣的工作。這可能是圖書館知道這是事實,因此你有誤報。