1 00:00:00,000 --> 00:00:00,180 2 00:00:00,180 --> 00:00:02,920 >> スピーカ1:のは、そのプログラムを書いてみましょう せずにユーザーから文字列を取得します 3 00:00:02,920 --> 00:00:05,700 CS50図書館を利用し GetStringメソッド機能。 4 00:00:05,700 --> 00:00:08,720 これを行うために、我々は先に行くと使います scanf関数、GetStringメソッドの機能 5 00:00:08,720 --> 00:00:10,950 この関数は、実際に使用しています フードの下に。 6 00:00:10,950 --> 00:00:13,780 しかし、私は意図的にこれを行うつもりだ バギーな方法で。 7 00:00:13,780 --> 00:00:17,230 私は私が考えるようにするつもりです 正しいこと、それは判明することを 8 00:00:17,230 --> 00:00:19,380 私の仮定がために起こっている かなり、非常に欠陥のあること。 9 00:00:19,380 --> 00:00:20,800 実際には、非常に危険。 10 00:00:20,800 --> 00:00:24,750 ので、私はするよ1のようなバグ 敵によって利用できることを確認 11 00:00:24,750 --> 00:00:28,870 その結果、あなたのマシンやプログラム 潜在的に引き継ぐことができる。 12 00:00:28,870 --> 00:00:30,200 >> 次のように始めましょう。 13 00:00:30,200 --> 00:00:33,540 最初の私たちの文字列を宣言してみましょう、 それ以外の場合は、char型のスターとして現在知られている 14 00:00:33,540 --> 00:00:34,750 とだと呼んでいます。 15 00:00:34,750 --> 00:00:39,400 次の文字列の入力をユーザーに求めることができ、 「お願いした文字列。」と同義と 16 00:00:39,400 --> 00:00:44,250 それでは、ユーザーから文字列を取得してみましょう 引用終わり引用符、 "%sを。」、scanf関数を使用してで 17 00:00:44,250 --> 00:00:47,760 つまりは、のは、その私たちのscanf知らせましょう 実際には、文字列を取得するために期待していますか 18 00:00:47,760 --> 00:00:48,630 ユーザーからの。 19 00:00:48,630 --> 00:00:50,810 >> しかし、今、我々はscanf関数に伝える必要があります 1他の事 - 20 00:00:50,810 --> 00:00:53,350 という文字列をどこに置くか ユーザーが用意されています。 21 00:00:53,350 --> 00:00:57,840 まあ、私は非常に単純に開始するつもりだ コンマSは、私がしたいことを指定して 22 00:00:57,840 --> 00:00:59,320 そこに文字列を書き込むscanf関数。 23 00:00:59,320 --> 00:01:04,818 私は、次のものをプリントアウトするつもりだ %sのprintfのような "感謝 24 00:01:04,818 --> 00:01:10,670 バックスラッシュNコンマ。」といつものように、私は 文字列Sを渡しに行く。 25 00:01:10,670 --> 00:01:14,920 それでは、保存しましょう​​コンパイルし、これを実行する プログラム、そして我々は誘導しないことができるかどうかを確認 26 00:01:14,920 --> 00:01:16,590 問題は、私が予測している。 27 00:01:16,590 --> 00:01:18,650 >> scanf関数-1を加えます。 28 00:01:18,650 --> 00:01:20,960 ./scanf-1。 29 00:01:20,960 --> 00:01:21,830 文字列下さい。 30 00:01:21,830 --> 00:01:25,540 それでは、のようなものを提供しよう "こんにちは。" 「NULLをありがとう。 "うーん、それはありません 31 00:01:25,540 --> 00:01:26,750 私は何を期待していた。 32 00:01:26,750 --> 00:01:28,240 それでは、ここで起こっているの? 33 00:01:28,240 --> 00:01:32,040 >> 私たちは宣言したので、まあ、それは結局のところ S CHARスターとして、私たちはしませんでした 34 00:01:32,040 --> 00:01:36,120 実際のアドレスSに格納されている メモリの実際のチャンク、scanf関数はしませんでした 35 00:01:36,120 --> 00:01:38,940 文字列を入れて任意の場所を持っている そのインチ入力したユーザー 36 00:01:38,940 --> 00:01:42,510 実際、ユーザーは入力するならば 「こんにちは」よりもはるかに長い列 37 00:01:42,510 --> 00:01:46,780 例えば、いくつかのテキストの行または 複数のテキストの段落では、それはかなりです 38 00:01:46,780 --> 00:01:50,280 我々は誘導し得ることを可能に セグメンテーションフォールトいわゆる。 39 00:01:50,280 --> 00:01:53,570 >> scanf関数はそれを知っているつもりはないので、 私は実際にアドレスを入れていない 40 00:01:53,570 --> 00:01:54,610 S内。 41 00:01:54,610 --> 00:01:58,000 むしろ、それはいくつかの値を見るために起こっている Sには、いくつかのパターンがビットことかもしれない 42 00:01:58,000 --> 00:02:00,910 非常によくゴミ値であっても、 そこにちょうど偶然。 43 00:02:00,910 --> 00:02:04,600 とscanfはまだ書き込もうとしている そのアドレスにユーザー文字列、 44 00:02:04,600 --> 00:02:08,789 それは、そのごみ値であっても 確かにクラッシュを引き起こす可能性があります。 45 00:02:08,789 --> 00:02:10,130 >> では、どのようにこれを修正するつもりですか? 46 00:02:10,130 --> 00:02:12,523