ノート

[BUG] 8382937: [lworld] System.arraycopy can copy null into a null-restricted array

FlatArrayKlass::copy_array で null-restricted 配列への null コピーが検出されるように修正しました。

概要#

 Valhalla では​ null を​取り扱える​配列と,​そうでない​配列の​2つの​概念が​登場します。​ しかし,​flat-array から​参照配列へ​ System.arraycopy する​場合に,​非 null 配列への​ null ​書き込みチェックが​抜ける​場合が​ありました。

 問題は​ FlatArrayKlass::copy_array に​ありました。​ コピー先へ​要素を​書き込むときに​ obj_at_put を​呼んでいましたが,​ 例外状態を​呼び出し元へ​伝える​ための​ CHECK(これは​マクロです)が​記述されていませんでした。

 ​その​ため,​null-restricted 配列に​対する​実行時チェックが​期待どおりに​働きませんでした1

 oop o = sh->obj_at(src_pos + i, CHECK);
-dh->obj_at_put(dst_pos + i, o);
+dh->obj_at_put(dst_pos + i, o, CHECK);

 修正自体は​ 1 行ですが,​null-restricted 配列の​不変条件に​関わる​ため,​ System.arraycopy が​ null を​コピーしようとした​ときに​ NullPointerException を​投げる​ことを​確認する​ 単体テストも​追加しました。

2026/06/24 PR 作成#

 PR では,​flat array から​ reference array へ​コピーする​経路で​ obj_at_put に​ CHECK が​渡されていない​ことを​説明しました2。​ この​経路では​ FlatArrayKlass::copy_array が​要素を​ 1 つずつ​取り出し,​ コピー先配列へ​書き込んでいます。

 追加した​テスト ArrayCopyStoreNull.java では, まず non-null 値を​ null-restricted array へ​コピーできる​ことを​確認し,​ 次に​ nullable array に​入れた​ null を​ null-restricted array へ​コピーしようとします。​ ここで​ NullPointerException が​投げられれば​成功です1

nullableArray[1] = null;
try {
    System.arraycopy(nullableArray, 1, nullRestrictedArray, 1, 1);
} catch (NullPointerException expected) {
    return;
}

2026/06/24-26 レビュー#

 Frederic Parain 氏3から,​修正と​テストに​ついて​確認いただきました。​ 同氏の​内部​テストでも​問題は​検出されず,​Approve を​いただきました。

2026/06/26 統合#

 Approve 後に​ /integrate を​行い,​同氏に​ /sponsor していただきました。​ 最終的に​ 2752ad84 と​して​ Valhalla の​ lworld ブランチへ​統合されました。


Footnotes#

  1. 2