2012-08-29 64 views
0

我寫一個這樣的代碼使用snprintf()snprintf()沒有格式說明符?

char myId[10] = "id123"; 

char duplicateId[10] = ""; 

snprintf(duplicateId, 10, myId); 

正如你所看到的,我不是指定格式說明%s明確。

是否需要顯式指定上述snprintf()語句中的格式說明符,如snprintf(duplicateId, 10, "%s", myId);

回答

6

不,你不必在技術上。但最好這樣做,因爲如果沒有常量格式字符串,則格式字符串保持可修改狀態,因此您的代碼更容易格式化字符串攻擊。

啊,並且還使用sizeof(duplicateId)而不是一個常數10 - 也出於安全原因(爲了避免將來的緩衝區溢出時更改sprintf輸出緩衝區的大小)。

2

不,你通常認爲是一個好主意,特別是如果有任何機會將用戶輸入文本傳遞給snprintf()。如果用戶輸入與它%否則一個字符串,就會有麻煩:

const char *userString = "%"; 
snprintf(duplicateId, sizeof duplicateIt, userString); /* BAD */ 

const char *userString = "%s"; 
snprintf(duplicateId, sizeof duplicateIt, "%s", userString); /* GOOD. */ 
2

這將是更好地使用%s因爲它是更安全......難道你得到這個警告? 也嘗試在最高警告級別進行編譯。

閱讀全文here