>> スピーカ1：のは、そのプログラムを書いてみましょう せずにユーザーから文字列を取得します
CS50図書館を利用し GetStringメソッド機能。
これを行うために、我々は先に行くと使います scanf関数、GetStringメソッドの機能
この関数は、実際に使用しています フードの下に。
しかし、私は意図的にこれを行うつもりだ バギーな方法で。
私は私が考えるようにするつもりです 正しいこと、それは判明することを
私の仮定がために起こっている かなり、非常に欠陥のあること。
実際には、非常に危険。
ので、私はするよ1のようなバグ 敵によって利用できることを確認
その結果、あなたのマシンやプログラム 潜在的に引き継ぐことができる。
>> 次のように始めましょう。
最初の私たちの文字列を宣言してみましょう、 それ以外の場合は、char型のスターとして現在知られている
とだと呼んでいます。
次の文字列の入力をユーザーに求めることができ、 「お願いした文字列。」と同義と
それでは、ユーザーから文字列を取得してみましょう 引用終わり引用符、 "％sを。」、scanf関数を使用してで
つまりは、のは、その私たちのscanf知らせましょう 実際には、文字列を取得するために期待していますか
ユーザーからの。
>> しかし、今、我々はscanf関数に伝える必要があります 1他の事 -
という文字列をどこに置くか ユーザーが用意されています。
まあ、私は非常に単純に開始するつもりだ コンマSは、私がしたいことを指定して
そこに文字列を書き込むscanf関数。
私は、次のものをプリントアウトするつもりだ ％sのprintfのような "感謝
バックスラッシュNコンマ。」といつものように、私は 文字列Sを渡しに行く。
それでは、保存しましょう​​コンパイルし、これを実行する プログラム、そして我々は誘導しないことができるかどうかを確認
問題は、私が予測している。
>> scanf関数-1を加えます。
./scanf-1。
文字列下さい。
それでは、のようなものを提供しよう "こんにちは。" 「NULLをありがとう。 "うーん、それはありません
私は何を期待していた。
それでは、ここで起こっているの？
>> 私たちは宣言したので、まあ、それは結局のところ S CHARスターとして、私たちはしませんでした
実際のアドレスSに格納されている メモリの実際のチャンク、scanf関数はしませんでした
文字列を入れて任意の場所を持っている そのインチ入力したユーザー
実際、ユーザーは入力するならば 「こんにちは」よりもはるかに長い列
例えば、いくつかのテキストの行または 複数のテキストの段落では、それはかなりです
我々は誘導し得ることを可能に セグメンテーションフォールトいわゆる。
>> scanf関数はそれを知っているつもりはないので、 私は実際にアドレスを入れていない
S内。
むしろ、それはいくつかの値を見るために起こっている Sには、いくつかのパターンがビットことかもしれない
非常によくゴミ値であっても、 そこにちょうど偶然。
とscanfはまだ書き込もうとしている そのアドレスにユーザー文字列、
それは、そのごみ値であっても 確かにクラッシュを引き起こす可能性があります。
>> では、どのようにこれを修正するつもりですか？