next up previous
次へ: プログラムの修正及び実行 上へ: 課題6:バッファオーバーフローの実験 戻る: 課題6:バッファオーバーフローの実験

プログラムの実行及び考察と解決策

200文字を超えた文字列を打ち込むとsegmentation faultが発生した。実行結果は省略する。segmentation faultとは、アクセスが許可されていないメモリを参照することで起こるエラーである。

このプログラムでsegmentation faultが起こる原因はgets()関数の仕様にある。gets()関数では読み込む文字列の最大サイズを指定できないため、入力した文字列のサイズがgets()関数の引数に指定したchar型配列のサイズより大きい場合、バッファオーバーフローが起こり、他のメモリを参照しようとするためsegmentation faultが起こる。このプログラムの場合は配列dmy[]が割り当てられているメモリ領域を参照しようとしたためにsegmentation faultが起こったと考えられる。

この問題の解決策としてはfgets()関数を使用することが挙げられる。fgets()関数では第二引数で最大読み込みサイズが指定できる。入力が最大読み込みサイズ-1より大きい場合はそれ以降の文字を読み込まない。



Shimabukuro Takuya 平成18年12月9日