8

次のような条件が必要です。

try
{
//bug condition
}
catch()
{
//Remove file
}

つまり、第三者がデータを閲覧できない非常に機密性の高いファイルを 1 つ作成しますが、コードにバグが発生した場合、どこでバグが発生したか正確にはわからないため、ファイルは削除されます。

そのため、try と catch を使用してそのバグをキャッチし、そのファイルを削除したいと考えています。C++ で例外をキャッチするにはどうすればよいですか??

バグがある場合はファイルを削除します。

お気に入り:

try
{
    char TempArray[10];
    char c = TempArray[11];
}
catch
{
    cout<<"Array out of boundry";
    deleteFile("Confi.txt");
}
4

7 に答える 7

8

セキュリティについて一言: 機密情報を含むファイルをハードディスク上に作成すると、プロセスの実行中にファイルがまだ開いている間にコンピュータをシャットダウンし、ハード ドライブを取り出してその内容を読み取ることができます。

ファイルがサーバー上にある場合は、ファイルを削除する前にプロセスを一時停止することで、基本的に同じことができます。

ファイルシステムからファイルを削除した場合でも、ファイルを削除しても内容が消去されないため、ファイルを読み取ることができる可能性が高くなります。

SOから学ぶのではなく、必要な専門知識を得るまで機密情報を扱わないことをお勧めします。しかし、それをしなければならない場合は、ここで提案されているウォッチドッグ プロセス + 暗号化が最適な方法だと思います。

于 2013-05-13T10:25:06.900 に答える
5

初めに:

あなたはそれをしたくありません。

例外は、バグを処理するためのものではありませんが、関数が呼び出す必要がある他の関数の事前条件を満たせなくなったり、独自の事後条件を満たしているという約束を維持したりすることを不可能にする実行時エラー状態です (呼び出し元が前提条件を満たしている)。たとえば、Herb Sutter によるこの記事を参照してください。

次のようなことは絶対に書かないでください。

try
{
    //bug condition <== NO! Exceptions are not meant to handle bugs
}
catch()
{
    //Remove file
}

むしろ:

assert( /* bug condition... */ );

質問に戻る:

プログラムには未定義の動作があり、ほとんどの場合、次のようにしても例外はまったくスローされません。

char TempArray[10];
char c = TempArray[11];

したがって、すべての例外をキャッチしても役に立ちません。これはバグ、つまりプログラミングエラーであり、制御をバグのあるルーチンに移す方法でバグを処理する必要があるかどうかは議論の余地があります。さらに、プログラムにバグが存在することを認めている場合、制御をバグのあるハンドラーに移しているだけではないでしょうか? それはそれをさらに悪化させる可能性があります。

バグは、アサーションを利用し、おそらくテスト駆動開発などの方法論を採用して、それらを防止することによって対処する必要があります。

これは、すべての例外をキャッチする方法に関して、次のことができると述べました。

try
{
    // ...
}
catch (...) // <== THIS WILL CATCH ANY EXCEPTION
{
}

ただしcatch (...)、設計ガイドラインとして使用することはお勧めできません。これは、処理されるはずのエラー条件を簡単に飲み込んで忘れてしまうためです。結局のところ、例外は、プログラマーがエラー コードのチェックを忘れないようにするために考案されたものでありcatch (...)、それを非常に簡単にします。

すべてをキャッチするには、すべての例外を から派生させてからstd::exception、次のようにする方がよいでしょう。

try
{
    // ...
}
catch (std::exception& e)
{
    // Do something with e...
}
于 2013-05-13T09:50:47.727 に答える
0

あなたのコードは、定義された境界の外にあるデータにアクセスしようとします。これは本質的に完全に有効な試みです。状況とコンパイラによっては、アクセス違反/セグメンテーション違反でコードがクラッシュする場合としない場合があります。ほとんどの場合、例外は発生しません。C++ では、システムによって暗黙的にではなく、コードによって明示的にのみ例外がスローされます。Java や C# などの高レベル言語とは異なり、問題が発生するとクラッシュします。

構文は考えられるすべてのcatch(...)例外をキャッチしますが、これはこの状況には当てはまりません。

于 2013-05-13T09:50:57.227 に答える
0

C++ では、メモリを直接操作でき、部分的にC互換性があります。使用しようとしている構文:

char some_array[10];

CC++ではなく一種の構文であり、

char c = some_array[11];

メモリへの raw アクセスです。これはunexpected behavior。つまり、何が起こるかは誰も教えてくれません。間違った文字を取得しただけで、プログラムが OS によって強制終了される可能性があります。または、月が地球に落ちます。=)

高レベルの機能が必要な場合は、純粋な C++ を使用してください。「C」配列の代わりに標準ライブラリを見てください。std::vector必要に応じて withat (size_type n)メソッドを使用してout_of_range例外を取得できます。

于 2013-05-13T10:02:26.553 に答える
0

他の回答が示唆しているように、この問題をネイティブの標準 C++ で正しく解決することはできません。実際、一度起こったことをやろうとすることundefined behaviourは、通常、本当に悪いことです。アプリの状態がわからない場合、コードを安全に実行するにはどうすればよいでしょうか? すぐに失敗するだけです。

問題を解決する適切な方法は、別の別の「ウォッチドッグ」プロセスでクリーンアップを実行することです。その非常に単純な - ウォッチドッグ プロセスにファイルの存在を常に監視させるだけです。それが存在するようになると、ウォッチドッグプロセスはそれを削除する必要があります。この削除は、ファイルへの最後の参照が存在するまで保留され、その後削除が実行されます [*nix OS ではファイルの名前が一時的な場所に変更され、Win システムではファイルが参照されなくなるまで待機します]。メイン プログラムがファイルの処理を終了すると (通常の手段またはクラッシュなどによって)、OS がファイルを正しく削除します。

于 2013-05-13T10:08:36.750 に答える
0

「プライベート」ファイルが常に削除されるようにしたい場合は、「ラッパー」プログラムはどうですか。

保護されたアプリケーションを実行し、終了するまで待機する新しいアプリケーションを作成します。終了したら (ただし、クラッシュまたはクリーン終了)、プライベート ファイルを削除してから終了します。

アプリケーションを実行する代わりに、ラッパーを実行します。

int main(void)
{
    int processId = exec("your protected app");

    WaitForProcessExit(processId);

    _unlink("protectedfile.bin");

    return 0;           

}
于 2013-05-13T10:12:41.987 に答える