4
fprintf(pFile,msg.c_str());

Xcodeで警告が表示されるのはなぜですか?

Format string is not a string literal (potentially insecure)

攻撃を防ぐためにこの警告が表示されると思います。msgに%sは、nullで終了するまでスタックを画面にストリーミングするようなものが含まれています。この場合に安全に使用する方法はありますfprintfか?

4

2 に答える 2

13

フォーマット文字列を指定することもできます。

fprintf(pFile, "%s", msg.c_str());

またはを使用してfputs

fputs(msg.c_str(), pFile);
于 2012-06-21T19:16:22.617 に答える
10

コンパイラが警告を発した理由は、ユーザーがmsgの内容に何らかの影響を与えて、独自のフォーマット指定子を挿入できる場合、文字列の印刷方法が「フォーマット文字列エクスプロイト」と呼ばれる脆弱性につながる可能性があるためです。 ("%n"など)。提案された回答(fprintf(pFile、 "%s"、msg.c_str());)は、フォーマット文字列が一定になっているため、これを修正します。

フォーマット文字列の悪用について詳しくは、http://julianor.tripod.com/bc/formatstring-1.2.pdfをご覧ください。

于 2012-06-21T19:20:55.050 に答える