すべてのまともなCプログラマーが知っておくべき/知っておくべき概念/技術/言語機能は何ですか(一般的なソフトウェアエンジニアリングなどを除き、C固有のもののみに焦点を合わせます)。私のC知識の可能性のあるギャップを埋めることができるように知りたいです。
2 + 2 = 4
すべてのまともなCプログラマーが知っておくべき/知っておくべき概念/技術/言語機能は何ですか(一般的なソフトウェアエンジニアリングなどを除き、C固有のもののみに焦点を合わせます)。私のC知識の可能性のあるギャップを埋めることができるように知りたいです。
2 + 2 = 4
回答:
Cに固有ですか?ほとんどの手続き型言語に共通する標準的な構成要素は別として、次のように言わなければなりません。
Pythagrasの答えへのコメントで「バッファオーバーフロー」について言及しましたが、おそらく私が少し意図したことを明確にする必要があります。Cでは、メモリを直接操作することは危険であることを知るだけでは十分ではありません。それが危険である正確な方法も理解する必要があります。私はこれらのすべてのケースで「自分自身を撃つ」という比phorが本当に好きではありません-多くの場合、それはあなたが引き金を引いているわけではありませんが、多くの場合あなたやあなたのユーザーに反する関心を持つ俳優です。
たとえば、降順のスタックを持つアーキテクチャ(最も一般的なアーキテクチャはこの法案に適合します-x86とARMが一般的に含まれます)で、関数を呼び出すと、関数の戻りアドレスは、ローカル変数で定義された後にスタックに配置されます関数の本体。したがって、バッファをローカル変数として宣言し、次のようにバッファオーバーフローをチェックせずにその変数を外部に公開する場合:
void myFn(void) {
char buf[256];
gets(buf);
}
外部ユーザーは、スタックからのリターンアドレスを上書きする文字列を送信できます。基本的に、現在の関数につながるコールグラフのプログラムの実行時のアイデアを変更できます。したがって、ユーザーは、アーキテクチャの実行可能コードのバイナリ表現である文字列、スタックからオーバーフローするのに十分なパディングmyFn
、およびmyFn
あなたが与えたコードを指すためにリターンアドレスを上書きする追加データを提供します。これが発生した場合、myFn
通常はその呼び出し元に制御を返すはずだったときに、代わりに悪意のあるユーザーが提供したコードに分岐します。信頼できないユーザーに公開される可能性のあるC(またはC ++)コードを記述する場合、この攻撃ベクトルを理解する必要があります。。スタックに対するバッファオーバーフローが、ヒープに対するバッファオーバーフローよりも頻繁に(常にではないが)容易に悪用される理由を理解する必要があります。malloc()
ed領域に制御構造があるという考えは、プログラムが別のmalloc()
、またはでクラッシュする理由を理解するのに役立ちますfree()
。
Cは、マシンがどのように動作するかについての低レベルの詳細を公開し、現在広く使用されている他のユーザー編集言語よりもマシンをより直接制御できます。大きな力には大きな責任が伴います。Cを安全かつ効果的に使用するには、実際にこれらの低レベルの詳細を理解する必要があります。
他の良い答えに加えて、防御的なプログラミング 手法をリストに追加したいと思います。
たとえば、機能の開始/終了時にアサートを使用して契約を確認します。