const char* abc = "foo";
printf(abc);
這是安全嗎?我看到一些遺留代碼,包括這個。 謝謝!C++ printf問題:如何安全地將char *傳遞給printf?
非常非常sorry..I犯了一個錯誤,我改了回來....
const char* abc = "foo";
printf(abc);
這是安全嗎?我看到一些遺留代碼,包括這個。 謝謝!C++ printf問題:如何安全地將char *傳遞給printf?
非常非常sorry..I犯了一個錯誤,我改了回來....
不,這不是安全的。假設abc
指向一個有效的字符串(它目前沒有),這種模式可能容易受到格式字符串漏洞的影響。請參閱Format string attacks
編輯:我看到您修復了您的問題中的代碼。它曾經通過abc
作爲printf
的第一個參數,這真的很糟糕。現在你提出了第一個參數"%s"
,它好多了。這兩者並不相似,並且在安全性方面存在巨大差異,因此請在舊代碼中查找此模式。
我假設你的abc
指向一個實際的字符串而不是無。清理你的示例代碼會很有幫助。
我已經在過去寫過一個靜態字符串並從未遇到過問題。回想起來,我很幸運。是正確的,它或許應該是這樣的:
const char* abc = "foo";
printf("%s", abc);
很難從有限的代碼片段,告訴你問題
但是,取決於.... printf的將打印它作爲一個格式字符串... ..所以只要它不使用任何格式字符串特殊字符這將是確定......
對於
const char* abc = "foo";
printf(abc);
我看不出有任何理由引入變量ABC,因爲2線條是如此的克洛SE。
如果abc不是一個常量字符串指針,那麼這是非常危險的。 由於printf依賴於參數列表,它本身不是類型安全的,因此很容易導致崩潰或類似情況。
僅供參考,格式化您的代碼將不勝感激。 – 2011-02-01 22:39:25
我假設在這些行之後應該有分號? – James 2011-02-01 22:40:12
正確的地方有一些分號也會有幫助。 – 2011-02-01 22:40:16