2017-06-12 9 views
1

私はこれまで、Cでポインタとメモリの割り当てを壊してしまい、実行中の他のプログラムやオペレーティングシステム自体がプログラムの外で破損し、システムがクラッシュする可能性があることを理解しています。これにより、ピースをピックアップしてプログラム開発を続けるために再起動が必要になります。Cでプログラミングして、オペレーティングシステムのセキュリティをより簡単にして、実行を無効にしましたか?

システムのセキュリティの改善により、これが起こらないようにしましたか?

MSDOSとWindows 3.1/95/98/Me、MacOS以前のバージョンでは(一般的にプリエンプティブマルチタスクがすべての標準となった前に)、システムセキュリティは一般的に存在しませんでした。プログラムはいつでもどこでもデータを書き込むことができます。

しかし、より現代的なシステム設計とプロセスセキュリティでは、プログラムは一般的に、システムセキュリティによって偶発的または意図的に他のものを傷つけることからブロックされます。

最新のプロセッサの実行禁止機能は、誤ってランダムなメモリ位置にジャンプしたり、プロセッサのマシンコードとして何かを実行したりするのを防ぐのに役立つかもしれません。

オペレーティングシステムのセキュリティをハックしようとせずに、Cを使用して最新のプログラミングに取り組むことができますか?

システム全体が誤ってクラッシュすることはありますか?これはもはや可能ではないと私は考えている。カーネルまたは他のシステムセキュリティは、アクションを実行し、アクションを停止します。

ログイン環境が壊れていて、ログアウトして再度ログインする必要がありますか?プロセスが通常は自分のログインセキュリティ環境内であっても他のプロセスメモリ空間にアクセスするべきではないので、これも防止されていると私は考えています。

一般的に、Cでのプログラミングは、今やどこからでも使用されているこれらのシステム保護のために過去よりもはるかに簡単になっているようです。

+1

普通のユーザープログラムはシステムによって保護されていますが、 g。デバイスドライバ、あなたは直前のものに素早く戻ります - ちょうど割り込みサービスルーチンでヌルポインタを逆参照すると想像してください... – Aconcagua

答えて

4

あなたが偶然行うことのできる領域では、MS-DOSの時代よりも確かに簡単です。私はインメモリのキャッシュを壊したバグを覚えています。私はそれの後に何かを残して幸運でした。

ここで、カーネル内で実行されるCコードを書いていない限り、それ以上はできません。あなたが積極的に欠陥を悪用しようとしている場合を除き、OSを一般的にクラッシュさせることはありません。

NXビットなど、Cプログラムの周りにセキュリティフェンスを少し立てようとするようなさまざまなことがありますが、実際にエラーが発生した場所に近い場所でプログラムをクラッシュさせます。しかし、あなたは簡単な分離アドレス空間で得た勝利のレベルには近くない。彼らは事を悪用しようとする積極的な試みをはるかに困難にするように設計されており、事故や間違いを犯すよりもはるかに優れています。

また、OSとは異なるログイン環境を破壊することも、一般的には統計的にはそうではありません。あなたのプログラムが洗練されたファイル操作を行っていると、ユーザーのファイルを乱したバグがあるかもしれません。

OSが実際にクラッシュするのをやめれば、誤ってリソースが枯渇する可能性があります。これはしばしば回復することができますが、進行中は非常に不快です。システムがクロールするのが遅く、プロセスを起動できない場合もあります。 Linuxはこれに対して何らかの保護を持っています。開発環境をcgroupに置くと、それを完全に防ぐことができます。

もちろん、能動的な悪用が可能なことは間違っている可能性があります。しかし、私はこれらのことを偶然行う統計的な可能性について話しています。

分割されたアドレススペースが最大の改善点となるのはおそらく、範囲外のアクセスや解放されたメモリへのアクセスなどのためにオンザフライであなたのプログラムを監視するツールであるValgrindです。

MS-DOSと初期のWindowsは、高品質のC開発環境を備えた一般的なコンピュータとして、またそのような無差別なメモリを使用するために、むしろ奇妙でした。それはWindowsを長くして、それを上回ってしまいました。プラットフォーム上のプログラミングのやり方はまだ少し変です。

3

短い答え:はい。

仮想メモリを使用し、データとコードを別々にしているコンピュータでは、ハードウェアの例外(OSがよりソフトなものに変換される)が発生するため、致命的なバグを書き込むことはずっと難しくなります。したがって、あなた自身の実行可能コードを上書きするバグや、データセグメントからのランダムな「オペレーションコード」の実行を開始する暴走コードを持つことはできません。バグはまだそこに残っており、修正する必要があります。しかし、それはずっとずっと不思議で、悲惨ではないでしょう。

これらのセキュリティ機能を持たないコンピュータは、プログラマによるより多くの注意とテストが必要です。

システム全体がクラッシュする可能性はまだありますが、主にOSとAPIのバグが原因です。 Windowsで時折起こる「死のブルースクリーン」はまだまだ問題です。ある程度の努力をして、100%CPUを使用するか、過剰な量のヒープメモリを割り当てることによって、コンピュータ全体を遅らせることができます。

関連する問題