2009-07-31 5 views
6

私のCコードにはgets()という関数が使用されています。 私のコードは正常に動作しているが、私は私がポップアップ表示しないように、この警告メッセージをしたい警告メッセージヘッダーファイルを通してGCCの警告メッセージを無効にしますか?

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

を取得しています。何か方法はありますか?

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

答えて

27

明白な答えは、コンパイラがあなたに伝えようとしていることから学ぶことです。絶対に危険なので、gets()を使用するべきではありません。代わりにfgets()を使用して、バッファオーバーランの可能性を防ぐことができます。

#define BUFFER_SIZE 100 
char buff[BUFFER_SIZE]; 
gets(buff); // unsafe! 
fgets(buff, sizeof(buff), stdin); // safe 
+0

おかげでニール...関数fgetsが正常に動作します。どうもありがとう。 –

+3

実際には、バッファサイズを複製するのではなく、 'sizeof buff'を使用します。 –

+3

実生活では、BUFFSIZEなどの定数を使ってバッファのサイズを設定し、fgets()呼び出しでバッファを使用したいと思うでしょう。 –

10

私は警告に耳を傾け、getsを置き換えます。これは私のために十分に明確である:

BUGS

取得は絶対に使用しないでください

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

8

使用関数fgets()の代わりになる()

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

ザ取得()関数は、バッファの長さをチェックしないと端を越えて書き込むことができ、スタックを変更します。これはあなたが聞く "バッファオーバーフロー"です。

5

gets関数をまったく使用しないでください。マンページには、代わりにfgetsを使用すると記載されています。

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

+0

この警告はリンカーによって与えられます。私はそれを無効にする方法を知らない。 – AProgrammer

6

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

[編集]

警告がリンカから来ているように見えます。 -cでコンパイルすると警告が出ますか? (リンクを無効にする)

24

本当に使用したい場合は、あなたはGCCの合理的に最近のバージョンを使用する場合は、使用することができますhttp://www.gamedev.net/community/forums/topic.asp?topic_id=523641

:ここ

からの答えです

#pragma GCC diagnostic ignored "your option here" 

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

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

不幸を、あなたはその方法は、(それはあまりにも簡単だろう、それはないだろう...)、あなたは個々の戦争をしなければならない「-Wall」無効にすることはできません手を使って壁を可能にするオプション(少なくとも矛盾するもの)。

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

EDIT: しかし、私が私のPC上で試してみました...警告を取得しますのために動作しないようです。

+3

+1 gets()を使用してはならないと私は同意しますが、実際にOPの質問に答えたのはあなただけです: – qrdl

+4

これは*コンパイラ*によって発行された診断にのみ有効です。 "gets is unsafe"メッセージは* linker *から来て、AFAIKはそれを無効にする方法はありません。 – zwol

-2

一般的な意見とは対照的に、すべてのプログラマーが、自分が書いていることに対して同じように慎重ではありません。 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"); 
} 
+8

誰が名前、電話番号、日付でSO答えに署名しますか? – bgw

+0

ユーザ入力が ''\ n' 'のみである場合、このルーチンは' NULL'を返します。元の 'gets()'は '' 'を返しました。 – chux

1

gets()の安全な代替品を提案してください。既存のコードで

は、gets()を置換するために、その関数としてfgets()を使用することが所望されない場合があり、両方の機能が消費'\n'を保存するための追加charを必要とするが、gets()保存しません。以下は、より大きなバッファサイズを必要としない代替品です。

gets(dest)がで置き換えるある:destが配列の場合
destサイズnchar配列へのポインタである場合gets_sz(dest, sizeof dest)
を使用し、あなたが本当に使いたい場合はgets_sz(dest, n)

char *gets_sz(char *dest, size_t size) { 
    if (size <= 1) { 
     if (size <= 0 || feof(stdin)) { 
      return NULL; 
     } 
    } 
    size--; 
    size_t i; 
    for (i = 0; i < size; i++) { 
     int ch = getchar(); 
     if (ch == EOF) { 
      if (i == 0) 
       return NULL; 
      break; 
     } 
     if (ch == '\n') 
      break; 
     dest[i] = (char) ch; 
    } 
    dest[i] = 0; 
    return dest; 
} 
0

を使用それは、フラグ-fsyntax-onlyを試してください。 gcc website

マニュアルは言う:

-fsyntax-only

Check the code for syntax errors, but don't do anything beyond that. 
関連する問題