2011-02-01 54 views
1
const char* abc = "foo"; 
printf(abc); 

這是安全嗎?我看到一些遺留代碼,包括這個。 謝謝!C++ printf問題:如何安全地將char *傳遞給printf?

非常非常sorry..I犯了一個錯誤,我改了回來....

+1

僅供參考,格式化您的代碼將不勝感激。 – 2011-02-01 22:39:25

+0

我假設在這些行之後應該有分號? – James 2011-02-01 22:40:12

+0

正確的地方有一些分號也會有幫助。 – 2011-02-01 22:40:16

回答

7

不,這不是安全的。假設abc指向一個有效的字符串(它目前沒有),這種模式可能容易受到格式字符串漏洞的影響。請參閱Format string attacks

編輯:我看到您修復了您的問題中的代碼。它曾經通過abc作爲printf的第一個參數,這真的很糟糕。現在你提出了第一個參數"%s",它好多了。這兩者並不相似,並且在安全性方面存在巨大差異,因此請在舊代碼中查找此模式。

3

我假設你的abc指向一個實際的字符串而不是無。清理你的示例代碼會很有幫助。

我已經在過去寫過一個靜態字符串並從未遇到過問題。回想起來,我很幸運。是正確的,它或許應該是這樣的:

const char* abc = "foo"; 
printf("%s", abc); 
1

很難從有限的代碼片段,告訴你問題

但是,取決於.... printf的將打印它作爲一個格式字符串... ..所以只要它不使用任何格式字符串特殊字符這將是確定......

0

對於

const char* abc = "foo"; 
printf(abc); 

我看不出有任何理由引入變量ABC,因爲2線條是如此的克洛SE。

如果abc不是一個常量字符串指針,那麼這是非常危險的。 由於printf依賴於參數列表,它本身不是類型安全的,因此很容易導致崩潰或類似情況。