C gets dangerouse
testがあるclient.cファイルは、Cライブラリが持つ関数getsを使用していますが、コンパイルするとこのwarningが表示されます.
test_client.c:(.text+0x128):warning:the 'gets' function is dangerouse and should not be used.
この警告が出て、ネットで探してみると、答えがたくさんありますが、私はやはりうるさいでしょう.
getsを実行すると、入力を待っています.では、今見てみましょう.私は異なる長さを入力して、どのような結果が得られますか.(これはwindowsで実行されている場合で、原理は似ています.添付ファイルの画像を見てください)
aを入力すると、aを出力します.(図01)
abcを入力するとabcを出力します.この時点でbuffは境界を越えているので、この時点で入力した値は、buffに属さない空間を上書きします.(図02)
abcdefを入力するとabcdefが出力されます.このとき、「***」コマンドが参照するメモリ「***」というボックスも表示されます.このメモリはwrittenできません.(図03)
以上の入力事例から,getsは入力長を制御できないことが分かった.その代わりの関数はfgetsで、入力の長さを制御することができます.
さっきの例のように
この時、私はabcを入力して、出力の結果もaです;(図04)
fgetsの具体的な使用については、このサイトを参照してください.
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
fgetsはstdio.h奥
注:getsは最後のリターン()を読み込まず、fgetsは読み込まれます.
test_client.c:(.text+0x128):warning:the 'gets' function is dangerouse and should not be used.
この警告が出て、ネットで探してみると、答えがたくさんありますが、私はやはりうるさいでしょう.
#include <stdio.h>
main()
{
char buff[2];
gets(buff);
printf("%s
", buff)
}
getsを実行すると、入力を待っています.では、今見てみましょう.私は異なる長さを入力して、どのような結果が得られますか.(これはwindowsで実行されている場合で、原理は似ています.添付ファイルの画像を見てください)
aを入力すると、aを出力します.(図01)
abcを入力するとabcを出力します.この時点でbuffは境界を越えているので、この時点で入力した値は、buffに属さない空間を上書きします.(図02)
abcdefを入力するとabcdefが出力されます.このとき、「***」コマンドが参照するメモリ「***」というボックスも表示されます.このメモリはwrittenできません.(図03)
以上の入力事例から,getsは入力長を制御できないことが分かった.その代わりの関数はfgetsで、入力の長さを制御することができます.
さっきの例のように
#include <stdio.h>
main()
{
char buff[2];
fgets(buff,2, stdin);//stdin
printf("%s
", buff);
}
この時、私はabcを入力して、出力の結果もaです;(図04)
fgetsの具体的な使用については、このサイトを参照してください.
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
fgetsはstdio.h奥
注:getsは最後のリターン()を読み込まず、fgetsは読み込まれます.