2012-02-01 109 views
-4

修正以下覆蓋誤差。我應該使用 sizeof(empID)-1或sizeof(empID)?我應該減去1刪除空字符? 例如:覆蓋問題+ C++中的snprintf用法

char empID[8] ;     
snprintf(empID,sizeof(empID)-1, "S%05d", (char)pManager -> GetEmpID(groupID, levelID)) ; 

Coverity的輸出:

調用風險函數(SECURE_CODING)[非常危險的。使用「sprintf」 時,如果執行不正確,可能會導致緩衝區溢出。因爲sprintf() 假設任意長的字符串,所以調用者必須小心,不要讓目標的實際空間溢出 。使用snprintf()替代, 或正確的精度說明符。

+2

爲什麼不閱讀[手冊頁](http://linux.die.net/man/3/snprintf)?那裏非常清楚。 – 2012-02-01 12:11:54

+0

Coverity報告位於您未顯示的代碼上。它與你的問題甚至是相關的,這似乎是「我如何使用snprintf()答案可能*是*」閱讀了精細的手冊「 – 2012-02-06 23:47:39

回答

1

功能的snprintf()和vsnprintf()寫至多大小字節(包括終止空字節( '\ 0'))至STR

http://linux.die.net/man/3/snprintf

所以沒必要減去1,大小已經包括空終止符。

+0

感謝INFO。這是非常有用的。 – Sudhakar 2012-02-01 12:15:26

+0

順便說一句在某些地方I它看起來是用sizeof(str)-1來表示的,一般情況下它需要減去「-1」。 – Sudhakar 2012-02-01 12:17:08

+0

@Sudhakar:你可能想到了strncpy() – stefaanv 2012-02-01 12:19:28

1

不要以爲你必須減去1,我這個

void main(){ 
    char ch_1[5]; 
    strcpy(ch_1, "1234"); 
    snprintf(ch_1, sizeof(ch_1), "abcdefg"); 
    printf("ch_1=%s\n", ch_1); 
} 

sizeof(ch_1)返回5這裏簡單測試。 snprintf自動減1,即它將此解釋爲「複製5-1=4個字符並在第5個位置放置空終止符」。

結果是ch_1 = abcd