0

非常に複雑な C プログラム (VM で実行) のトレースの制御フロー グラフを取得しました。コントロールの依存関係とは別に、プログラム トレースの CFG がある場合に抽出できる情報を知りたいです。ありがとうございました

4

1 に答える 1

1

ここで区別する必要があります。

  • 制御フロー グラフは、プログラムの制御を近似したものです制御フロー グラフは、プログラムの任意の実行について、フローを制御できる場所を示します。プログラムがグラフの特定のエッジを実行しない可能性は完全にあり得ます。

    i := 23;
    x := some_complicated_function_returning_zero();
    if (x < i) {
       print "Hello, world!";
    }  else {
       print "Bad!";
    }
    

そのプログラムでは、else分岐は決して実行されませんが、プログラム分析ツールは通常、分岐の両側に制御フロー エッジがあることを報告します。これは、プログラム分析が概算であるためです。

  • プログラムのトレースは、プログラムの制御フロー グラフ内のエッジの走査です。優れたテスト セットには、一般に、考えられる制御フロー パスの多く (または少なくとも、制御フロー グラフの構造の不正確さまで、実行可能なパス) をカバーするテストが含まれますが、それを超えて、幅広い範囲をカバーするテスト ケースが含まれます。それらの実行パス内で変数などが取る値の範囲。

トレースを使用すると、1 回の実行でプログラムがどのように実行されたかがわかります。一方、制御フロー グラフを使用すると、「私のプログラムが実行できる可能性のある方法は何か」を知ることができます。

実際のプログラムは大きいため、プログラム全体の制御フロー グラフは非常に大きくなりますが、指数関数的な分岐効果がないため、トレースはかなり小さくなります...

于 2012-09-21T21:56:02.353 に答える