1

学校のコンピュータ ラボで を使用してプログラムを作成し、次のコードを入力するfputsと、コンパイラがエラーgets is a dangerous function to useと同様のエラーを返しましfputs

たが、自宅で:

#include <stdio.h>
main()
{
    FILE *fp;
    char name[20];
    fp = fopen("name.txt","w");
    gets(name);

    fputs(name,fp);
    fclose(fp);
}

エラーは発生しません。学校でのものはこれに似ていましたが、少し長く、より多くの変数がありました.
自宅ではコードブロックを使用し、学校では Fedora で提供されているデフォルトの gcc を使用しています。
コンパイラの問題でしょうか?

4

5 に答える 5

2

gets読み取る文字数を正確に把握し、それに応じて十分な大きさのバッファを使用する必要があります。読み取ったファイルの内容よりも小さいバッファを使用すると、割り当てられたバッファの境界を超えて書き込むことになり、未定義の動作と無効なプログラムが発生します。

代わりにfgets、読み取るデータ量を指定できる which を使用する必要があります。

nameほとんどの場合、割り当てられたバッファーはファイルの内容を保持するのに十分な大きさであるため、エラーは発生しませんが、そうname.txtでない場合は問題であり、コンパイラーは警告を発行します。

于 2012-01-19T06:19:27.917 に答える
1

getsバッファ オーバーフローを防ぐ方法がないため、これは確かに危険です。

たとえば、ユーザーが 150 文字を入力した場合、ほぼ確実にプログラムに問題が発生します。scanfまた、制限のない書式指定子と一緒に を使用する"%s"ことは、制御できない入力に対しても避ける必要があります。

ただし、規格に準拠しているため、 の使用はエラーにはなりgetsません。せいぜいそれは警告であるべきです (開発者として、「警告をエラーとして扱う」などの設定をしない限り)。

fputs全然危険じゃないから大丈夫。

を使用した堅牢なユーザー入力関数については、こちらを参照してくださいfgets。これは、バッファー オーバーフローを防ぐために使用できます。

于 2012-01-19T06:19:26.783 に答える
1

それは、さまざまなコンパイラのさまざまな設定にすぎません。おそらく、Codeblocks が使用するコンパイラはそれほど冗長ではないか、警告がオフになっています。

コンパイラに関係なく、バッファオーバーフローのチェックがないため、使用するのは危険な関数です。代わりに fgets または fputs を使用してください。

于 2012-01-19T06:20:09.990 に答える
0

他の回答はすべて対処されていますがgets、これは本当に本当に危険です。

しかし、質問にも言及しfputsました。fputs関数は完全に安全です。この種のセキュリティ上の懸念はありません。

コンパイラーが「fputs.

于 2018-03-17T09:01:25.090 に答える
0

問題に関しては、どのコンパイラにも問題はありません。Timothy Jones によって提供されたリンクを見ると、この警告が発行される理由が理解できます。コンパイラのバージョンが異なる場合、コンパイラは異なるレベルの警告を発行するように構成されています。

于 2012-01-19T06:21:08.073 に答える