スピーカ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はまだ書き込もうとしている そのアドレスにユーザー文字列、 それは、そのごみ値であっても 確かにクラッシュを引き起こす可能性があります。 では、どのようにこれを修正するつもりですか?