3 1 sprintf函式引起的緩衝區溢位

2021-07-23 04:21:54 字數 1206 閱讀 6956

2013-11-28 15:14 劉新浙/劉玲/王超/李敬娜 等 人民郵電出版社 

字型大小:t

|  t

綜合評級:

《從缺陷中學習c/c++》第3章庫函式問題,本章主要介紹庫函式的使用中會遇到的問題。使用庫函式可以降低軟體開發的難度,提高**編寫的效率。本節為大家介紹sprintf函式引起的緩衝區溢位。

ad:51cto 網+ 第十二期沙龍:大話資料之美_如何用資料驅動使用者體驗

第3章  庫函式問題

本章主要介紹庫函式的使用中會遇到的問題。使用庫函式可以降低軟體開發的難度,提高**編寫的效率。這一章主要涵蓋的內容有,呼叫字串庫函式時需要注意對字串結束符'\0'的處理,複製字串的時候要注意記憶體空間是否寫溢位,函式呼叫前需要做必要的初始化,函式使用後對其返回值需要做正確處理,容器類的增、刪操作要注意迭代器失效等,忽視這些方面將帶來各種各樣的問題。

3.1  sprintf函式引起的緩衝區溢位

**示例

int main()  

現象&後果

程式執行時,用sprintf函式把字元陣列src的內容往字元陣列buf複製時會溢位,可能出現段錯誤(segmentation fault)。

bug分析

上述**從乙個字元陣列src複製字串到另外乙個字元陣列buf中,src的字串長度為26,但buf的長度只有10,用sprintf函式進行複製的時候會把src的所有字元往buf裡寫,從而引起buf溢位。

正確的做法是在複製之前檢查buf的長度是否足夠,或者直接用更安全的snprintf函式代替sprintf。

正確**

int main()  

else  

return 0;  

}  

程式設計建議

在libc參考手冊對sprintf函式的說明中有乙個警告,如果複製的字串長度超過提供的buf串的長度,sprintf函式會變得很危險。為了避免這個問題,可以用snprintf函式來代替sprintf函式。但在使用snprintf的時候,在呼叫這個函式之後需要對返回值作檢查,如果返回值比分配的buf長度要大,表示複製不完整,則需要重新分配大的空間之後再一次呼叫snprintf函式。

在libc參考手冊中,也同時提到,在實際使用過程中,用asprintf函式代替snprintf函式會更方便些。asprintf函式不需要預先分配buf,它能在複製過程中根據實際複製源字串的大小動態分配空間,具體可參考libc參考手冊。

sprintf 函式的用法

最近在做畢業設計,裡面需要把圖形的座標轉換為字元來檢驗圖形座標的正確與否。所以較多的用到了sprintf 函式。例如 int sign 100 char s1 10 sprintf s1,d sign pdc textout 0,0,s1 這裡就把sprintf 函式的用法總結一下。int spri...

sprintf函式的用法

sprintf 格式化輸出函式 圖形 功能 函式sprintf 用來作格式化的輸出。用法 此函式呼叫方式為int sprintf char string,char format,arg list 說 明 函式sprintf 的用法和printf 函式一樣,只是sprintf 函式給出第乙個引數str...

sprintf函式的使用

把格式化的資料寫入某個字串 緩衝區。stdio.h int sprintf char buffer,const char format,argument buffer char型指標,指向將要寫入的字串的緩衝區。format 格式化字串。argument 可選引數,可以是任何型別的資料。返回值 字串...