我正在使用Visual C++ 2008的systemC。我寫了一個簡單的hello世界程序。但是我重複出現此錯誤:SystemC錯誤,使用visual c + + 2008
警告C4996:'sprintf':此函數或變量可能不安全。
爲什麼會發生這種情況?我將不勝感激任何幫助。
我正在使用Visual C++ 2008的systemC。我寫了一個簡單的hello世界程序。但是我重複出現此錯誤:SystemC錯誤,使用visual c + + 2008
警告C4996:'sprintf':此函數或變量可能不安全。
爲什麼會發生這種情況?我將不勝感激任何幫助。
編譯器警告使用sprintf()
,因爲它可能會導致緩衝區溢出,因爲它不檢查緩衝區的限制。相反,使用snprintf()
永遠不會超過傳入限制填充緩衝區。
這個建議也被manpage給出:
由於sprintf的()和vsprintf()假設一個任意長的字符串,來電者必須 小心,不要溢出實際的空間;這通常是不可能保證的。請注意, 所產生的字符串的長度是與區域相關的並且難以預測。使用 snprintf()和vsnprintf()代替(或asprintf(3)和vasprintf(3))。
「只有當你是個白癡時,這往往不可能保證」。在C編碼足夠長的人知道真正不安全的東西(比如'gets',或者'scanf(「%s」)'你無法控制輸入的東西)和像'sprintf'這樣的東西之間的區別_can_使其安全。其他人都應該回到使用VB :-)因爲我知道我在做什麼,所以我總是使用#define關閉這些警告。 – paxdiablo 2012-01-28 01:48:58
我的確同意,當涉及到潛在的漏洞時,gets()和sprintf()會屬於不同的類別,但是使用'sprintf()'有一個危險,你沒有提到它,它與維護:修改格式字符串或傳遞給'sprintf()'的其他參數時,很容易忘記更新緩衝區大小。 – 2012-01-28 01:55:10
這是一個警告,而不是一個錯誤。 – Philippe 2012-01-31 09:52:46