[英]strncpy is replaced by __strncpy_chk and fails
我有一個聲明
strncpy(&data->m_bin->data,versionStr,data->m_bin->sizeData);
在我的應用程序中,它本身很好並且運行良好。 這里data-> m_bin-> data是一個char,調用應用程序確保它后跟一個數據塊,該數據塊足夠大,可以保留strncpy()移交的所有數據。
但是,當我使用GCC / Linux構建此版本時,此函數在__strncpy_chk()中崩潰。 因此,似乎我的strncpy()被__strncpy_chk()替換為參數s1使用了錯誤的長度。
那么如何確保使用正確的s1長度調用__strncpy_chk()?
謝謝!
這里data-> m_bin-> data是一個char,調用應用程序確保它后跟一個數據塊,該數據塊足夠大,可以保留strncpy()移交的所有數據。
這導致有效的C程序是不尋常的。 指針出處規則通常意味着這會導致未定義的行為。
如果char
位於結構的末尾,則可以使用靈活的數組成員,以使編譯器更清楚意圖是什么。
如果您不想更改源,可以使用-U_FORTIFY_SOURCE
或-D_FORTIFY_SOURCE=0
進行編譯。 這將禁用強化版本替換strncpy
。
strncpy(&data->m_bin->data,versionStr,data->m_bin->sizeData);
操作員的address of
對我來說很可疑。 我希望有類似的東西:
strncpy(data->m_bin->data,versionStr,data->m_bin->sizeData);
或者可能:
strncpy(&data->m_bin->data[0],versionStr,data->m_bin->sizeData);
如何確保使用正確的s1長度調用
__strncpy_chk()
?
好吧,你本身不能。 這是FORTIFY_SOURCE
和對象大小檢查的一部分,並且在編譯器可以推導出目標緩沖區大小時使用。
您可以執行以下操作,假設data
是size sizeData
數組。
/* avoid undefined behavior */
ASSERT(data->m_bin->data != NULL);
ASSERT(versionStr != NULL);
ASSERT(data->m_bin->sizeData > 0);
size_t l1 = data->m_bin->sizeData;
size_t l2 = strlen(versionStr);
/* min function */
size_t len = l1 < l2 ? l1 : l2;
/* if versionStr is shorter than len, then data will be backfilled */
strncpy(data->m_bin->data, versionStr, len);
/* NULL terminate, even if it truncates */
data->m_bin->data[data->m_bin->sizeData-1] = '\0';
您可能應該使用-Wall
打開警告。 我懷疑你應該得到一個使用運營商的address of
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.