16

いくつかのプレゼンテーションを見てみると、次の主張に出くわしました。JVMがクラスをロードすると、そのコンテンツを分析して、オペランドスタックのオーバーフローやアンダーフローがないことを確認できます。私は同じ主張をする多くの情報源を見つけましたが、それがどのように行われるかを特定していません。

静的分析を使用してこのような検証を行う方法は私にはわかりません。引数として値を取得し、それを使用して一連のポップを実行する(悪意のある)メソッドがあるとします。ロード時には、メソッドの呼び出し元によって指定された引数に依存するため、反復回数は不明です。したがって、実行時にのみ、アンダーフローがあるかどうかを判断できるはずです。ここで何が欠けていますか?

4

2 に答える 2

11

バイトコードベリファイアの基本的な説明は、Java仮想マシンの仕様に記載されています。

簡単に言うと、スタックの深さはすべての分岐ポイントでわかっており、同じマージポイントでマージする2つの実行パスも同じスタックの深さである必要があります。したがって、ベリファイアでは、対応するプットなしで一連のポップを実行することはできません。

于 2012-05-10T20:37:50.620 に答える
6

メソッドのコードは実行ブロックに分割されます。「ブロック」とは、飛び出したり飛び込んだりせずに実行できる一連の命令です。ブロックは、すべての可能な実行パスの有向グラフを作成します。

ブロックは常に最初に特定のスタックサイズを想定し、最後に固定スタックサイズを持ちます(開始+すべてのプッシュ-すべてのポップ)。ベリファイアは、特定のブロック「b」から到達できるすべてのブロック「a」について、bの終了スタックサイズがaの開始スタックサイズと一致することを確認します。

于 2012-05-10T20:41:50.867 に答える