例外のあるデータフロー分析


8

データフロー分析は、制御フローグラフに対して機能します。検討中の言語が例外をサポートしている場合、制御フローグラフが爆発する可能性があります。

この爆破に対処するための標準的なテクニックは何ですか?例外によって引き起こされたエッジを完全に無視できますか?とにかく、データフロー分析は過剰近似を計算するので、精度は落ちますが適切なソリューションになります。これは本当ですか?

更新:最後に掘り下げることができたいくつかの便利なリンクを次に示します。


「爆発」とはどういう意味ですか?どの例外をどこにスローできるかを静的に知っていますか?どのようなサイズの増加を受け入れますか?
ラファエル

1
分解とは、基本ブロックの数とそれらを接続するエッジの数が増加し、結果として分析実行時間が長くなる可能性があることを意味します。おそらく間違っていると思いますが、これはコンパイラーの問題である可能性があり、おそらくそれを処理する方法があるのではないかと考えました。主題の理解に興味があります。
ベルピース

回答:


10

例外を無視することは健全ではありません。例:

let g = {
     raise E;
}
let f = {
     x := interesting_stuff();
     g();
     x := 0;
}

を分析するときは、例外fg発生するという事実を考慮する必要があります。そうしないと、xからの戻り時に常に0であると誤って判断してしまいますf

例外を処理するための「標準的な」手法があることを知りません。このトピックに関する文献はいくつかありますが、Googleの検索で見つけることができるほど、どの論文が関連しているのか私にはわかりません。

正式には、例外を条件付きステートメントに変換して、呼び出しチェーンを伝達し、もちろん制御フローグラフを拡大することができます。多くの具体的な例では、例外ケースは、大量のデータが殺さあまり興味深いケース、であるので、前方アプローチ(生存性を分析する必要はありませんに遅延して扱うべきハンドラがデータを殺す場合は例外パス) 。


よろしければフォローアップの質問です。基本的に、一部のエッジが欠けていると、不健全な結果が得られます。プログラムの実行中に実際には表示されないエッジエンコーディング制御フローがある場合はどうなりますか?良い結果が得られますが、精度が低下する可能性はありますか?
ベルピース2016年

1
@bellpeaceエッジが実行中に決して取られないパスに対応する場合、それはデッドコードであるため、健全性に影響を与えることなく削除できます。結果はより正確になります。プログラムのより良い近似が得られるので、その動作のより良い近似を得ることができます。
Gilles 'SO-邪悪なことをやめなさい'

では、本質的に、エッジを追加しても、健全性には影響せず、精度にのみ影響しますか?
ベルピース2016年

1
@bellpeaceはい:潜在的なパスを追加すると、実際には発生しない可能性のある新しい潜在的なフローが導入される可能性がありますが、発生するフローは消去されません。
Gilles「SO-邪悪なことをやめなさい」2016

ちょっと待ってください。この例では、fから戻るときにxは常にゼロです。gが例外を発生させた場合、fは戻りません。ここで、fが例外をキャッチした場合(およびおそらく再スローした場合)、それは別の問題ですが、それはフローグラフの明示的なエッジになります。
仮名
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.