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

これは安全ですか適切ですか?私はこれを含むいくつかのレガシーコードを見た。 ありがとう!C++ printf質問:どうすればchar *をprintfに安全に渡すことができますか?

は非常に非常にsorry..Iがミスを犯し、私は、これは安全ではありません....バック

+1

参考までに、コードを書式設定していただければ幸いです。 –

+0

私はその行の後にセミコロンがあると仮定していますか? – James

+0

正しい場所にいくつかのセミコロンも役立ちます。 –

答えて

7

それを変更しました。 abcが有効な文字列(現在はそうではない)を指していると仮定すると、この種のパターンはフォーマット文字列の脆弱性の影響を受けやすい可能性があります。 Format string attacks

編集:私はあなたの質問にコードを修正したことがわかります。これは、printfの最初の引数としてabcを渡していましたが、これは本当に悪いことです。最初の引数"%s"を作成したので、はるかに優れています。これらの2つは似ていないし、セキュリティに大きな違いがあるので、あなたのレガシーコードでこのパターンを探します。

+0

彼はコードを修正しましたが、私はあなたの答えはまだ関連性があると思います。 – Muggen

3

私はあなたのabcが何もなく実際の文字列を指していると仮定しています。サンプルコードを整理すると便利です。

これまで静的な文字列を書き出すためにこれを行いましたが、問題は発生しませんでした。振り返ってみると、私は運が良かった。正しいことが、それはおそらくのようになります。

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

ええ、ありがとう。あなたは正しいです –

1

ご質問に限られたコードの断片から

を伝えるのは難しいけど、依存.... printfの書式文字列としてそれを印刷します... ..soであれば、それはOKになります任意のフォーマット文字列の特殊文字を使用していないよう...

0

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

のために、私は変数ABCを導入しない理由を見ることができない、2理由ラインはとてもクローンですse。

abcがconst文字列ポインタでない場合、これは非常に危険です。 printfはタイプセーフではない引数リストに依存しているため、非常に簡単にクラッシュする可能性があります。

関連する問題