簡體   English   中英

導致崩潰的sprintf_s

[英]sprintf_s caused for crash

我遇到問題了。 例:

try
{
    char strMes[6];
    sprintf_s(strMes, sizeof(strMes), "%s", "012345678");
    printf(strMes);
}
catch(...)
{
    printf("Wrong\n");
}

在調試環境中,這會導致調試器出現“緩沖區太小”消息。

在發布環境中,它導致崩潰。

我試圖將try-catch塊替換為__try -__ except(EXCEPTION_EXECUTE_HANDLER)塊,但是我得到了相同的行為。

我大約有1K調用sprintf_s函數,因此將sprintf_s替換為_snprintf_s並不是我的選擇。 (請參見sprintf_s的緩沖區太小

請幫忙!

首先,我相信您應該使用snprintf而不是sprintf_s

其次,有一個無效的CRT 參數處理程序被調用。 嘗試設置。

在進一步使用strMes之前, 必須檢查sprintf_s的返回值。 否則,您如何知道緩沖區是否足夠大? sprinft_s可能沒有任何內容寫入strMes ,因此仍未初始化。 這就是導致崩潰的原因(嘗試刪除sprintf_s ,它也可能崩潰。)

sprintf_s文檔:

寫入的字符數;如果發生錯誤,則為–1。 如果buffer或format是空指針,則sprintf_s和swprintf_s返回-1並將errno設置為EINVAL。

PS:由於try / catch,您應該將此問題標記為C ++,而不是C。

閱讀文檔

....如果任何一項檢查失敗,則將調用無效的參數處理程序,如參數驗證中所述...

默認行為是拋出。 您可以覆蓋它。

如果您的VS版本支持,則應在其上運行代碼分析。

了解有關代碼分析的信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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