C、Objective-C、またはC ++でコーディングする場合、CLang Static Analyzerを使用して、実際に実行せずにソースを批判できます。
使用可能なメモリデバッグツールがいくつかあります。ValGrind、Mac OS XのGuard Malloc、* NIXのElectric Fenceです。
一部の開発環境には、新しく割り当てられたページや新しく解放されたページをゴミで埋めたり、割り当てられていないポインターの解放を検出したり、各ヒープブロックの前後にデータを書き込んだりするデバッガーアロケーターを使用するオプションがありますそのデータの既知のパターンが変更された場合に呼び出されます。
Slashdotのある人は、デバッガーの新しいソースラインをシングルステップ実行することで多くの価値を得たと言いました。「それだ」と彼は言った。私は彼のアドバイスにいつも従うわけではありませんが、私が持っているとき、それは私にとって非常に役に立ちました。珍しいコードパスを刺激するテストケースがない場合でも、デバッガーで変数をいじってそのようなパスを取得できます。たとえば、メモリを割り当ててから、デバッガーを使用して新しいポインターをNULLに設定します。メモリアドレス、次に割り当て失敗ハンドラーをステップ実行します。
アサーション-C、C ++、およびObjective-Cのassert()マクロを使用します。あなたの言語がアサート関数を提供していない場合は、自分でアサート関数を書いてください。
アサーションを自由に使用し、コードに残します。私はassert()を「テストを続けるテスト」と呼びます。私はほとんどの関数のエントリポイントで前提条件を確認するために最も一般的に使用します。これは、Eiffelプログラミング言語に組み込まれている「Programming by Contract」の一部です。もう1つの部分は事後条件です。つまり、関数の戻り点でassert()を使用しますが、前提条件ほど多くのマイレージを得ることはできません。
assertを使用して、クラスの不変条件を確認することもできます。クラスには不変条件がまったく必要ではありませんが、最も賢明に設計されたクラスには不変条件があります。クラス不変条件とは、オブジェクトを一時的に矛盾した状態にする可能性のあるメンバー関数の内部を除き、常に真である条件です。そのような関数は、戻る前に常に一貫性を復元する必要があります。
したがって、すべてのメンバー関数は、入り口と出口で不変式をチェックでき、クラスは、他のコードがいつでも呼び出すことができるCheckInvariantという関数を定義できます。
コードカバレッジツールを使用して、ソースのどの行が実際にテストされているかを確認し、テストされていない行を刺激するテストを設計します。たとえば、物理メモリがほとんどなく、スワップファイルがないか非常に小さいVMで構成されたVM内でアプリを実行することで、低メモリハンドラを確認できます。
(何らかの理由でBeOSはスワップファイルなしで実行できましたが、そのように非常に不安定でした。BFSファイルシステムを作成したDominic Giampaoloは、スワップなしでBeOSを実行しないように促しました。なぜそれが重要なのかを見てください。しかし、それは何らかの実装アーティファクトであったに違いありません。)
I / Oエラーに対するコードの応答もテストする必要があります。すべてのファイルをネットワーク共有に保存してから、アプリのワークロードが高いときにネットワークケーブルを取り外してください。同様に、ネットワーク経由で通信している場合は、ケーブルを外します-またはワイヤレスをオフにします。
私が特に腹立たしいのは、堅牢なJavascriptコードを持たないWebサイトです。Facebookのページには何十もの小さなJavascriptファイルがロードされますが、いずれかがダウンロードに失敗すると、ページ全体が壊れます。たとえば、ダウンロードを再試行するなど、何らかのフォールトトレランスを提供するか、スクリプトの一部がダウンロードされなかった場合に何らかの合理的なフォールバックを提供する何らかの方法が必要です。
大きな重要なファイルを作成している最中に、デバッガーまたは* NIXで「kill -9」を使用してアプリを強制終了してみてください。アプリが適切に設計されている場合、ファイル全体が書き込まれるかまったく書き込まれないか、または部分的にしか書き込まれていない場合、書き込まれたものは破損せず、保存されたデータは完全に使用可能ですファイルの再読み込み時にアプリ。
データベースには常にフォールトトレラントディスクI / Oがありますが、他の種類のアプリにはほとんどありません。ジャーナリングされたファイルシステムは、停電やクラッシュが発生した場合のファイルシステムの破損を防ぎますが、エンドユーザーデータの破損や損失を防ぐために何もしません。これはユーザーアプリケーションの責任ですが、データベース以外はほとんどフォールトトレランスを実装しません。