2011-02-07 14 views
1

次の質問を考慮して、プログラムがうまく機能しているかどうかを判断できますか?私たちのプログラムがうまくいくと判断するにはどうすればいいですか?

  1. メモリが正常にオペレーティングシステム
  2. によって再利用されるいずれかがあふれで起こっがあるかどうかを判断するためにいくつかのコードを書いて実行しているの後には、スタックオーバーフロー

はありませんか?

私たちのアシスタントは、プログラムを実行した後、私たちにフィードバックを与えてくれます。

フィードバックには、オーバーフローがあったかどうか、間違った方法で空き/削除を使用していたかどうか、その他いくつかのことが表示されます。

私は彼女がどのように見つけたのだろうか?

+0

あなたはその人にソースコードを提供しましたか? – sharptooth

+0

上記の2つの基準は必要ですが、十分ではありません。プログラムには、他の欠陥がある可能性があります。間違った出力を生成したり、意図した目的に対して遅すぎることがあります。 – MSalters

+0

@sharptooth、はい、なぜ –

答えて

3

あなたはその人がソースコードを持っていると言います。つまり、彼がプログラムを分析することができるということです。読んだり思考したり、巧妙なプログラムを使ったりしています。彼は次のように見ることができる。例えば

void someCleverFunction() 
{ 
    char* buffer = new char[100]; 
    if(someCondition) { 
     //do something with the buffer 
     delete[] buffer; 
     return; 
    } 
    Sleep(1000); 
} 

し、それはsomeCondition一度delete[]が呼び出されていない会ったことは確かメモリリークだされていないことを彼に明らかです。

これは静的コード解析と呼ばれています。

3

上記を推測する方法はいくつかあります。

  1. などvalgrindのようなツールを使用してください:この は、メモリリークや、

  2. 両方 正と負のテストケースのためにあなたのプログラムに 入力を作成することになるシミュレータを検出するのに役立ちます。

乾杯!

0

Visual C++を使用していますか? もしそうなら、これを読んでください。http://msdn.microsoft.com/en-us/library/5at7yxcs(VS.71).aspx

gccを使用しているLinuxの場合、Valgrindを使用してください。それは本当に良いドキュメントを持っています。

+0

いいえ、私は視覚的に使用していません –

+0

そのことは素晴らしいですが、CRTのデバッグバージョンでのみ動作します。また、ソースコードなしではあまり役に立ちません。 – sharptooth

1

私はプログラムの有効として「うまく機能」を定義します頼まれたと、それはすべての状況でそれをするのかと、それは何でしょうか?これは、1)プログラムが何をすべきかを明確に記述し、2)すべての状況を可能な限り徹底的にテストすること。

しかし、バッファオーバーラン、メモリリークやスタックオーバーフローは、プログラムの堅牢を意味し、「うまくを振る舞う」の一部である:プログラムがクラッシュには例があってはならない。ここでの徹底的なテストも必要とされ、静的解析(例:カバレッジ)や動的解析(例。valgrind)も使用する必要があります。なぜなら、メモリリークの問題は、実際にメモリが足りなくなってからずっと遅くなるまで気付かないことがあるからです。使用するツールは、プラットフォームとプログラムの規模によって異なります。

関連する問題