0

私はいくつかの C++ コードを持っていますが、何がわかりません。例として、次のようにします。

//main.cpp
#include<iostream>
using namespace std;
int T[100];

int main()
{
    for(int i = 0; i < 100; ++i)
        T[i] = i;
    int x;
    cin>>x;
    cout<<T[x]<<endl;

    return 0;
}

でコンパイルしてcl /O2 /nologo /EHsc main.cpp実行していmain < inFile.inます。inFile.in コンテンツが 1 つの数字と改行であるとしましょう500。プログラムはアドレスの下のメモリを読み取り、それを出力するため、出力は乱数T+500です。そのような場合に実行時エラーを取得したい(チェックの可能性は、このようなことが起こったものです)。これは main.cpp にアクセスせずに可能ですか? 具体的には、ASP.Net MVC アプリケーションの C# の Process クラスによって、これらすべてをプログラムで実行しています。プログラムが例外をスローしたか、予約されていないメモリを読み取ったかなどを確認したい.

4

2 に答える 2

0

上記のプログラムのソースを変更できない場合は、「外部」環境 (シェル) で実行し、戻り値を取得して 0 に対してテストします。他の値を指定すると、正しく動作しません。

また、プログラムがクラッシュするのを待つのではなく、処理できないことがわかっているそのようなプログラムの入力データを検証して、その発生を防ぐこともできます。

プログラムを変更できる場合、簡単な解決策は std::vector または std::deque を使用することですが、これらは似ていますが重要なのは、 at()メソッドが境界をチェックするため、 operator[]演算子ではなくat()メソッドを使用することです

#include<iostream>
#include<vector>
using namespace std;

std::vector<int> T(100);

int main()
{
    for(int i = 0; i < 100; ++i)
        T[i] = i;
    int x;
    cin>>x;
    cout<<T.at(x)<<endl;

    return 0;
}

at()が不適切な範囲外のパラメーターで呼び出された場合、例外がスローされ、次のようにキャッチできます。

try{
    cin>>x;
    cout<<T.at(x)<<endl;
}
catch(...)
{
    cout << "exception while accessing vector's data" << endl;
}
于 2015-01-03T18:04:34.357 に答える
0

これは開発目的でのみ使用したい機能ですか、それとも本番環境でも使用したい機能ですか?

開発目的のみの場合、実行時チェック用のツール (Valgrind/Dr Memory など) の下でアプリケーションを実行するか、コンパイル方法を変更して実行時デバッグ チェックを含めることができます (上記のケースでの動作は保証されませんが、他の多くで役立ちます)。これにより、アプリケーションが非常に遅くなることに注意してください (したがって、開発中のアプリケーションにのみ使用する必要があります)。

実稼働環境に関しては、あなたがやりたいことを行う方法を知りません-一般に、利用可能なメモリを読み取る場合にのみOSセグメンテーション違反を当てにすることができます(運が良ければ-そうでない場合)それは「うまくいく」)。

例外については、あなたの言いたいことを100%理解しているとは言えません-これは「なぜプログラムが終了したのか」ですか?そのような場合、クラッシュしたアプリケーションのコア ダンプを取得する可能性があり (正常終了の場合はリターン コードがあると想定します)、後でそれを調べてクラッシュの理由を取得するか、場合によってはデータの回復を試みることもできます。Windows でダンプを収集する方法については、http: //msdn.microsoft.com/en-us/library/windows/desktop/bb787181%28v=vs.85%29.aspxを参照してください。

ただし、これは本番環境よりも開発環境で役立つ機能でもあります。

于 2015-01-03T17:10:28.660 に答える