2004年度のソフトウェア演習IIの授業は終りました。 この授業のページは参照用の資料として保存しているものです。最新の情報・資料は江上の授業ページで。 |
C言語の危険な領域へ |
危険な兆候?
これまでの授業の範囲ですでにその兆候が現れていた。1) たとえば「配列」使用時に宣言して配列要素の制限を越えてアクセスした場合。
関数の引数の数を間違えた場合。
bash$ cat test.c #include <stdio.h>
main()
{
int data[10];data[1000] = 10;
printf("%d\n", data[1000]);
}bash$ cc test.c ← 翻訳時のエラーは無い
bash$ ./a.out
Segmentation fault (core dumped) ← エラーが発生しプログラムが実行されない(表示されない) !!!
bash$
2) scanf 関数での '&' の付け忘れなど
bash$ cat test2.c #include <stdio.h>
main()
{
int a = 0;printf("数を入力してください:");
scanf("%d", a);printf("入力されたのは %d です\n", a);
}bash$ cc test2.c ← 今度も翻訳時のエラーは無い
bash$ ./a.out
数を入力してください:10
Segmentation fault (core dumped) ← エラーが発生しプログラムが途中終了してしまう
bash$
[Q] 上の例でプログラムのどの部分がおかしいのか指摘 or 修正してみましょう
例のような実行時のエラーを発見し修正(デバッグ)するのは比較的面倒だ(タイプミスのエラーより難しい)。[Q] なにが?なぜ?難しいの?