質問

できないかなぁ、とおもって一時間(Java)Bytecodeかったんだから指示を入力?私は理解しているがADDオペレーションを必要と区別する整数値のほか、FPのほか(いIADDとFADD).しかし、なぜ必要なの区別ISTOREとFSTORE?彼らはいずれも同じ操作る、最下位ビットから32ビットスタックをローカルな変数です。

の答えを考えることができるでタイプ-安全性、これを防ぐために:(ILOAD,ILOAD,FADD).しかし、この型の安全性はすでに施行され、Java言語です。OKなので、クラスファイルの形式は以下の通りですが直接結合し、Javaではこの方法律型-安全のための言語をサポートしていないのですか?思想?お願い致します。

編集: フォローアップの芦の答えです。わたしは、この最小のプログラム:

public static void main(String args[])
{
    int x = 1;
}

編纂には:

iconst_1
istore_1
return

用bytecode編集、変更の指示:

iconst_1
fstore_1
return

で返される java.lang.VerifyError:期待し、希ガスタックです。

私の場合はスタックにある情報の種類、ビットのようにFSTORE指導を知っていたことを扱ったが、intのではない浮か?

注意: 見られませんでしたがより良いタイトルのこの質問です。お気軽に改善に努めます。

役に立ちましたか?

解決

これらの指示を入力確保のためのプログラムはtypesafe.積載時のクラスの仮想マシンを行い検証のバイトコードを、例えば、フロートな引数として渡した方法を期待し整数とします。この静的検証、検証者を測定することができるの種類および数値をスタックに指定する。の負荷のお店の指示が必要なタイプのタグでは、局所変数のスタックフレームがどう対応すればよいですか(すなわちできistoreる局所変数の後にfstore同じです。タイプタグの指示、検証者に知らどのような値が格納され、各地に変更します。

の検証者を見各opcodeの方法を常に追い続けどんな種類のスタックのための変数を実行後に出来上がった。することは別の種類の確認などの重複をチェックを行い、javaコンパイラです。の検証手順を防ぎ込任意のコードがこのVMの実行が不正な指導をより安全性をJavaプラットフォームに招くことなく、大きなランタイム刑の種類前に動作します。実行時の型チェックのための各opcodeするパフォーマンスのメソッドを実行し、その静的検証を行う一度だけのクラスがロードされます。

例1:

Instruction             Verification    Stack Types            Local Variable Types 
----------------------- --------------- ---------------------- ----------------------- 
<method entry>          OK              []                     1: none
iconst_1                OK              [int]                  1: none
istore_1                OK              []                     1: int
return                  OK              []                     1: int

例2:

Instruction             Verification    Stack Types            Local Variable Types 
----------------------- --------------- ---------------------- ----------------------- 
<method entry>          OK              []                     1: none
iconst_1                OK              [int]                  1: none
fstore_1                Error: Expecting to find float on stack

エラーのための検証お知っているfstore_1期待のfloatのスタックでの実行結果を前指示葉intのスタックです。

この検証は実行することなく、opcodesなものではなく、むしろ作の種類の指示のように、javaコンパイラーをエラーを書くときに押さえておくべき (Integer)"abcd".コンパイラのないプログラムを実行するかを知ること "abcd" は文字列できなキャスト Integer.

他のヒント

Intelの芦の説明は彼の答えは、検証者はクラスであるとみなされます。ていただきたいと思いる無数の組み合わせで自分だけの検証を使用JVMパラメータとします。これはオススメです!

おンプルプログラム(iconstとfstore)の結果の検証を無効にするVMしているとエラーが表示され止めのJVM以下のメッセージ:

=============== DEBUG MESSAGE: illegal bytecode sequence - method not verified ================

#
# An unexpected error has been detected by HotSpot Virtual Machine:
#
#  EXCEPTION_PRIV_INSTRUCTION (0xc0000096) at pc=0x00a82571, pid=2496, tid=3408
#
# Java VM: Java HotSpot(TM) Client VM (1.5.0_15-b04 mixed mode, sharing)
# Problematic frame:
# j  BytecodeMismatch.main([Ljava/lang/String;)V+0
#
...

回答お問い:これらのメソッドのバイトコードが異なるようなものを求められます。例えば、特定の建築についての整数のオペランドのスタックが浮動小数点演算ハードウェアが登録する

お答えし、VerifyError場合にスローされるクラスがロードされない場合で実行されます。検証プロセスを記述 こちらの;注pass#3.

すべてのbytecode必provably typesafeには、静的データフロー分析をあげつつあると考えています。しかし、こんに説明できない指示のように_store異なる種類のタイプからも推し量ることができるタイプの値をスタックです。とがありますようにポップdupは、スワップというと、操作は複数の種類です。一部の指示で印、その他ながるものでは説明のつかない独自開発者がJava.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top