linux 使用不安全的sprintf函數,存儲字符越界致使程序莫名崩潰問題

linux c++編程linux

問題背景c++

在處理一個公共模塊的代碼中,其中有如下代碼片斷編程

1 //代碼片斷-組合一組字符串並存放到szSignKey數組中
2 char szSignKey[256] = {0};                                                                                                                                                                                                      sprintf(szSignKey, "userid&%u&version&%s&msg_body&%s&%s", uiUserID, strVersion.c_str(), strMsgBody.c_str(), SIGN_KEY);
strMsgBody是一組json格式的字符串,裏面會根據協議請求傳入不一樣數據的json格式字符串。
當strMsgBody請求的字符串過大,致使要存入szSignKey數組中的字符串超過255個時,會致使字符數組越界,超出的字符會在數組後面的內存空間中存儲。
可是這個問題不會立刻暴露出來,printf szSignKey的時候,仍是會輸出完整的越界字符串數組。可是在函數執行完return後,析構函數內的局部變量的時候致使程序崩潰。
使用gdb調試的時候,顯示的也是一些其餘臨時對象析構致使崩潰,沒法找到真正的崩潰緣由。

問題緣由:
sprintf函數是不安全的c 字符處理函數,它在寫字符串到字符數組時不會考慮字符數組的大小,當要存儲的字符超過數組長度時,會把超出的字符寫在數組後面的內存空間中,致使字符數組存儲越界。
類型的C函數還有strcpy()等

解決辦法:
使用安全的字符處理函數strncpy()、 snprintf()等。使用安全的字符處理函數會要求寫入字符數粗的最大長度參數,超出的部分不會寫入到數組中。
上面的sprintf代碼能夠修改爲
1 char szSignKey[256] = {0};                                                                                                     
snprintf(szSignKey,sizeof(szSignKey),"userid&%u&version&%s&msg_body&%s&%s", uiUserID,strVersion.c_str(),strMsgBody.c_str(), SIGN_KEY);

  超出的字符會被截斷掉,不會致使字符數組越界問題。json

相關文章
相關標籤/搜索