2

次のコードでコンパイル エラーが発生しました。

printf((char *) バッファ);

私が得ているエラーメッセージは次のとおりです。

cc1:フォーマットは文字列リテラルではなく、フォーマット引数もありません...

他のマシンでエラーなしでコードをコンパイルして実行できたので、インストールするのを忘れたライブラリがいくつかあると思います...

PS: 他のマシンで同じコードを実行できたという事実とともに疑問が生じます... gcc のバージョンの違いがこのような問題を引き起こすのではないでしょうか?

4

4 に答える 4

5

新しい GCC バージョンは、printf および同様の関数に渡されたフォーマット文字列を解析し、引数リストがフォーマット文字列と正しく一致するかどうかを判断しようとします。通常はフォーマット文字列である最初の引数のバッファを渡したので、これを行うことはできません。

あなたのコードは間違った C ではありません。C の使い方が間違っているだけです。これにより、入力を制御しない場合に、文字列にパーセント記号が含まれるエラーのクラスから保護されます。printf または sprintf ファミリの関数の最初の引数として文字列リテラル以外を渡さないことがベスト プラクティスです。

于 2009-07-22T20:00:02.750 に答える
4

試す

printf("%s", (char*) バッファ);

;-)

于 2009-07-22T19:45:49.910 に答える
1

この警告は、次の場合に gcc によって生成されます。

-Wformat-nonliteral

が設定されています。-Wallorの一部ではない-Wextraため (少なくともバージョン 4.4.0 では)、コードを警告なしでコンパイルしたい場合は削除してください。

于 2009-07-22T20:08:42.903 に答える
0

これは安全のための警告であり、エラーではありません。この新しいコンパイラは、明らかにそれについてより厳格になっています。Cでは実際に違法だとは思わないので、コンパイラにはこれをエラーとして扱うことを無効にするオプションが必要です。

ただし、printf の最初の引数として文字列リテラル以外のものを渡すことはほとんどありません。そうすることが非常に恐ろしい考えであり、コンパイラがそれについて警告する特別な組み込みチェックを持っている理由は次のとおりです。 printf の最初の引数として渡す非リテラル文字列に、たまたま printf 書式設定文字が含まれているとします。次に、printf は、実際には渡されなかった 2 番目、3 番目、4 番目などの引数にアクセスしようとします。そうしようとすると、プログラムがクラッシュする可能性があります。非リテラルの最初の引数が実際にユーザーによって提供された場合、悪意のあるユーザーがプログラムを意のままにクラッシュさせる可能性があるため、問題はさらに悪化します。

于 2009-07-22T19:54:16.897 に答える