ヘッダーファイルを使用してGCCの警告メッセージを無効にしますか?
質問
Cコードで gets()
関数を使用しています。
コードは正常に機能していますが、警告メッセージが表示されています
(.text+0xe6): warning: the `gets' function is dangerous and should not be used.
この警告メッセージが表示されないようにします。方法はありますか?
警告を無効にするヘッダーファイルを作成することで、このような可能性があるのではないかと考えています。または、コンパイル中に私の目的に役立つオプションはありますか?または、この警告がポップアップしないように gets()
を使用する特定の方法があるかもしれませんか?
解決
明らかな答えは、コンパイラが何を伝えようとしているのかを学ぶことです-決して安全ではないので、gets()を決して使用しないでください。代わりに fgets()を使用すると、バッファオーバーランの可能性を防ぐことができます。
#define BUFFER_SIZE 100
char buff[BUFFER_SIZE];
gets( buff); // unsafe!
fgets( buff, sizeof(buff), stdin ); // safe
他のヒント
本当に使用したい場合。
回答はこちらから: 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で試しました。
警告に注意して、 gets
を置き換えます。これは私には十分明らかです:
バグ
gets()を使用しないでください。なぜなら、データを知らずに伝えることは不可能だからです gets()が読み取る文字数を進めます。これは、gets()が格納し続けるためです。 バッファの終わりを過ぎた文字は、使用するのが非常に危険です。持っている コンピュータのセキュリティを破るために使用されました。代わりにfgets()を使用してください。
gets()の代わりにfgets()を使用します
char buffer[BUFSIZ];
/* gets(buffer); */
fgets(buffer,sizeof(buffer), stdin);
gets()関数は、バッファーの長さをチェックせず、末尾を超えて書き込み、スタックを変更できます。これは「バッファオーバーフロー」です。あなたは聞いた。
gets()
を使用する正当な理由は本当にありません。 Cの標準でさえ、それは時代遅れだと言っています!代わりに fgets()
を使用してください。
[編集]
警告はリンカから来ているようです。 -c
でコンパイルすると警告が表示されますか? (リンクを無効にします。)
gets
関数を使用しないでください。マンページでは、代わりに fgets
を使用するように指示されています。
GCCは、プラグマを使用して警告を無効にするためにGCCが提供する機能を提供しません。さまざまな警告オプションをフラグとして使用する必要があります代わりにコンパイラ。
gets()
の安全な代替物を提案します。
既存のコードでは、 gets()
を置き換えるために、 fgets()
を使用することが望ましくない場合があります。この関数には追加の char
両方の関数が消費する '\ n'
を保存しますが、 gets()
は保存しません。以下は、より大きなバッファサイズを必要としない代替です。
各 gets(dest)
は次のように置き換えられます:
dest
が配列の場合、 gets_sz(dest、sizeof dest)
を使用します
dest
がサイズ n
の char
配列へのポインターである場合、 gets_sz(dest、n)
を使用しますp>
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;
}
本当に使用したい場合は、フラグ -fsyntax-only
を試してください。
gccウェブサイトのマニュアル言う:
-fsyntax-only
Check the code for syntax errors, but don't do anything beyond that.
-fno-stack-protector
は、安全ではないにもかかわらず gets()
関数を使用できるようにするオプションです。
-Wno-deprecated-declarations
は非推奨の警告をオフにします
gets()
gcc myprogram.c -o myprogram -fno-stack-protector -Wno-deprecated-declarations
プログラムがバッファをオーバーランさせる可能性があるため、完全に安全ではないと言うすべての人に同意します。これは非常に危険な可能性があるため、fgetsを支持して廃止された理由です。
ただし、セキュリティコースの概要を理解している場合は、バッファオーバーランとスタックオーバーフローの概念で遊ぶための小さなテストプログラムを作成できると非常に役立ちます。
一般的な意見に反して、すべてのプログラマーが自分が書いているものに等しく注意を払っていないわけではありません。 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");
}