8

gets()Cコードで関数を使用しています。コードは正常に動作していますが、警告メッセージが表示されます

(.text+0xe6): warning: the `gets' function is dangerous and should not be used.

この警告メッセージが表示されないようにしたい。何か方法はありますか?

いくつかの警告を無効にするためのヘッダー ファイルを作成することで、そのような可能性があるのではないかと考えています。または、コンパイル中に私の目的に役立つオプションはありますか? またはgets()、この警告がポップアップしないようにする特定の使用方法があるのでしょうか?

4

10 に答える 10

28

明らかな答えは、コンパイラが伝えようとしていることから学ぶことです。gets() はまったく安全ではないため、絶対に使用しないでください。代わりにfgets()を使用してください。これにより、バッファ オーバーランの可能性を防ぐことができます。

#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff);   // unsafe!
fgets( buff, sizeof(buff), stdin );   // safe
于 2009-07-31T19:23:15.947 に答える
25

本当に使いたいなら。

回答は次のとおりです:http ://www.gamedev.net/community/forums/topic.asp?topic_id = 523641

適度に新しいバージョンのgccを使用する場合は、次を使用できます。

#pragma GCC diagnostic ignored "your option here"

たとえば、これらのヘッダーで「浮動小数点の比較は安全ではありません」というエラーが発生する場合は、次を使用します。

#pragma GCC diagnostic ignored "-Wfloat-equal".

残念ながら、その方法で「-Wall」を無効にすることはできません(簡単すぎるでしょう...)。-Wallが手動で有効にする個別の警告オプション(少なくとも競合するもの)を実行する必要があります。

ドキュメント: http: //gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas

編集: しかし、それは警告を得るにはうまくいかないようです...私は自分のPCで試しました。

于 2009-07-31T19:32:31.887 に答える
9

警告に注意して交換しgetsます。これは私にとって十分に明らかです:

バグ

gets() を使用しないでください。データを事前に知らずに gets() が読み取る文字数を知ることは不可能であり、gets() はバッファーの末尾を超えて文字を格納し続けるため、使用するのは非常に危険です。コンピューターのセキュリティを破るために使用されています。代わりに fgets() を使用してください。

于 2009-07-31T19:24:45.677 に答える
9

gets() の代わりに fgets() を使用する

char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);

gets() 関数はバッファの長さをチェックせず、最後を超えて書き込み、スタックを変更する可能性があります。これが、よく耳にする「バッファ オーバーフロー」です。

于 2009-07-31T19:25:18.547 に答える
6

を使用する正当な理由はありませんgets()。C標準でさえ、それは時代遅れだと言っています! fgets()代わりに使用してください。

[編集]

警告はリンカから来ているようです。でコンパイルすると警告が表示され-cますか? (リンクを無効にします。)

于 2009-07-31T19:26:11.073 に答える
5

このgets関数はまったく使用しないでください。マンページでは、fgets代わりに使用するように指示されています。

GCC は、プラグマを使用して警告を無効にするために GCC が行う機能を提供しません。代わりに、さまざまな警告オプションをコンパイラへのフラグとして使用する必要があります。

于 2009-07-31T19:25:22.057 に答える
1

-fno-stack-protectorgets()どんなに安全でなくても機能を使えるようにするオプションです。

-Wno-deprecated-declarations非推奨の警告をオフにします

でコンパイルする例を次に示します。gets()

gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations

プログラムがバッファをオーバーランする可能性があるため、完全に安全ではないという意見に同意します。これは非常に危険な場合があるため、fgets を支持して廃止されました。

ただし、セキュリティ コースの入門を受講している場合は、バッファ オーバーランとスタック オーバーフローの概念を試す小さなテスト プログラムを作成できると非常に役立ちます。

于 2019-01-28T02:36:48.703 に答える
-4

一般的な意見とは反対に、すべてのプログラマーが同じように自分が書いているものに注意を払っていないわけではありません。 gets()C90では常に標準であり、いくつかの正当な理由でライブラリに入れられました. プログラムの例、ドキュメント、単体テストの足場、宿題などで適切に使用すれば、他のどの文字列関数よりも「危険」ではありません。

さらに、これまでにないgets()方法で読みやすさを向上させfgets()ます。そして、自分の議論をどのような順序で並べるかを調べるために、自分の思考の流れを中断する必要は決してありません。

次の回避策では、別のお気に入りの関数を使用して改行を削除します。:)

 #define gets GET_LOST
 #include "stdio.h"
 #undef gets

 #include "limits.h"

 char *gets(char *s)
 {
    return strtok(fgets(s, INT_MAX, stdin), "\n");
 }
于 2010-11-18T02:20:09.080 に答える