■今回のプログラム
長さ5のchar配列を作成。
gets()で標準入力。
printf()で標準出力。
■ソースファイル
#define NUM 5
int main(void)
{
//文字列バッファ宣言(長さは5)
char s[NUM];
printf("s address:%X¥n", &s);
printf("s length:%d¥n¥n", sizeof(s));
printf("input string:");
gets(s);//バッファのサイズを渡せないのでチェックのしようが無い
printf("%s¥n", s);
}
■実行結果
s address:BFFFFCBB
s length:5
warning: this program uses gets(), which is unsafe.
input string:fdsafdas
fdsafdas
親切にwarningが出てますが無視して大量入力。
宣言した領域をはみ出して書き込んでますね。
printf()も領域完全無視で読みにいってるみたいです。
fscanf()が嫌われてるのもこれが理由らしいです。
作るのは簡単(よりもたちが悪い)なだけに対策が難しいですね。