Up Top

Class のロード/リンク/初期化 : リンク処理 (3) : バイトコードの検証処理(verification)


Under Construction

概要(Summary)

(以下の内容は大部分が HotSpot Runtime Overview : Bytecode Verifier and Format Checker に基づく. こちらも参照のこと)

クラスのリンク中の verification 処理は Verifier::verify() で行われる.

なお, 現在の HotSpot 内には 2種類の verifier が実装されている.

クラスファイルのバージョンナンバーが 50 未満 (JDK 5 以下) の場合, type inference で検証する. バージョンが 50 以上のクラスファイルであれば type checking で検証するが, StackMapTable attribute を変更せずにコード部分だけ変更する古いツールがあるかもしれないため, 失敗した場合には type inference にフォールバックする.

参考(for your information)

備考(Notes)

以下のコマンドラインオプションが verification 処理に影響する.

verification 対象のクラスを制御する (なお, デフォルトではブートストラップ・クラスローダがロードしたクラスは verify 対象外).

なお, この情報は HotSpot 内部では以下の二つのフラグで扱われている (BytecodeVerificationLocal, BytecodeVerificationRemote) (See: Verifier::should_verify_for())

Type Checking verifier を使用するかどうかを設定 (オプションをオフにした場合は新しいクラスファイルに対しても Type Inference verifier を使用).

Type Checking verifier が失敗した際に Type Inference verifier にフォールバックするかどうかを設定.

処理の流れ (概要)(Execution Flows : Summary)

Verifier::verify()
-> * type checking verifier を使用する場合
     -> ClassVerifier::verify_class()
        -> ClassVerifier::verify_method()
           -> 

   * type inference verifier を使用する場合
     -> Verifier::inference_verify()
        -> (1) verify 処理用の関数を取得する
               (可能なら VerifyClassCodesForMajorVersion() を取得. だめなら VerifyClassCodes())
               -> verify_byte_codes_fn()
                  -> os::native_java_library()

           (1) 取得した verify 処理用の関数を呼び出す
               -> * VerifyClassCodesForMajorVersion() の場合
                    -> VerifyClassForMajorVersion()
                       -> verify_field()
                       -> verify_method()
                          -> verify_opcode_operands()
                          -> initialize_exception_table()
                          -> initialize_dataflow()
                          -> run_dataflow()
                          -> verify_constant_pool_type()

                  * VerifyClassCodes() の場合
                    -> VerifyClass()
                       -> VerifyClassForMajorVersion()
                          -> (同上)

処理の流れ (詳細)(Execution Flows : Details)

Verifier::verify()

See: here for details

Verifier::is_eligible_for_verification()

(#Under Construction) See: here for details

Verifier::should_verify_for()

(#Under Construction) See: here for details

ClassVerifier::verify_class()

See: here for details

ClassVerifier::was_recursively_verified()

See: here for details

ClassVerifier::verify_method()

(#Under Construction)

Verifier::inference_verify()

See: here for details

verify_byte_codes_fn()

See: here for details

VerifyClassCodesForMajorVersion()

See: here for details

VerifyClassCodes()

See: here for details

VerifyClassForMajorVersion()

(#Under Construction) See: here for details

VerifyClass()

See: here for details


This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.