簡體   English   中英

strncpy被__strncpy_chk替換並失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM