アプリ版:「スタンプのみでお礼する」機能のリリースについて

C言語はコンパクトで軽量であることを意図して作られていると聞いたのですが、この場合の軽量とは、プログラマへの負担が軽量なのか、計算リソースの消費量が少ないということなのか、よくわかりません。また、何がコンパクトなのでしょうか?
また、その軽量さゆえに、脆弱性を生みやすいらしいのですが、なぜ軽量だと脆弱性が生まれやすいのでしょうか?
よろしくお願いします。

A 回答 (1件)

いろんなところでしょう。


プログラマの負担はむしろ重いです。

○多くの言語では、サブルーチンや関数は、どんな順番で宣言しても、同じように利用できます。
 C言語は、先に宣言しないと使えません。
 プログラマとしては、場所を考えないといけないので面倒ですが、コンパイラにとっては上から順番に処理すればいいので簡単になります。
※ 他の言語では、「とりあえず保留しておいて、宣言が見つかったら戻る」とか「最初に宣言の一覧を作るために読み込んで、そのあと頭に戻ってコンパイルしなおす」とかの工夫が必要です。

○一番はっきりと違いが出るのは配列でしょう。
他の言語では、添字がちゃんと確保した範囲になっているかチェックし、エラーを出したり、自動で範囲を増やしたりします。

C言語では、そのようなチェックはありません。範囲も増えません。
範囲内で使うように、プログラマが注意しないといけません。
そのかわり「チェックする」動作が無い分、プログラムが軽くなります。

範囲のチェックをしないので、範囲外にアクセスしても、律儀に該当するアドレスにアクセスしにいきます。
例えば int a[10] ;としたとき、 a[10000]=0 ; としても、それ自体はエラーではありません。

しかし、実際にはエラーになることも多いです。
それは、a[10000]のアドレスがOSで保護されているとか、プログラムの他の変数の領域を書き換えてしまったからとかいった理由からです。
まったく影響の無い領域になっていて、何事もなく処理が続く場合もあります。

このような配列の仕様は、脆弱性にもつながります。
例えば、文字列は文字の配列です。\0までが区切りです。
この区切りを忘れると、本来の文字列の範囲を越えて、\0が見つかるまで文字列だと認識します。
ユーザー名だけprintfしようとしたのに、\0が入ってなかったため、続けてパスワードまで表示してしまった、等ということが起りかねません。
    • good
    • 0
この回答へのお礼

わかりやすい回答ありがとうございます。
要するに作りが簡素であるためエラーチェックなども不十分ということですね。
ありがとうございました!

お礼日時:2015/05/09 17:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!