OpenJDKで遊んでいたらバグを見つけたのでBug Reportを出した話
概要
OpenJDK 11(11-ea+15)で、 java -XX:
とするとセグメンテーション違反で落ちるエラーに遭遇しました。
既に修正が入った最新のEA版が公開されていてもう大丈夫かなという雰囲気なのでバグ発見から報告、修正までの流れ等を記事にします。*1
報告したバグレポートのURL
Java Bug System: [JDK-8204055] SIGSEGV in java -XX: - Java Bug System
Java Bug Database: Bug ID: JDK-8204055 SIGSEGV in java -XX:
見つけたきっかけ
先日のJava Day TokyoでGraalのセッションが聞けたので試そうとしてたのですがなかなかうまく行かなくて、 その試行錯誤中にたまたまtypoし
$ java -XX:
を実行してしまったのが始まりでした。
Unrecognized VM optionとまでは出るのですが、その後のセグフォがなんか変だなというところから、よくよく見てみるとどうやらOpenJDK 10では再現しないことが分かり、バグ報告に至りました。
JDK 11のjavaコマンドで -XX: だけつけるとセグフォで落ちるw
— noko(バイトコードになりたいイッヌ) (@noko_k) May 29, 2018
なんかGraalが有効にならんな〜ってやってたらたまたまバグ踏んだっぽい。 pic.twitter.com/IhbRxabN6c
— noko(バイトコードになりたいイッヌ) (@noko_k) 2018年5月29日
報告方法
以前からバグ報告ページBug Reportがあることは知っていて*2、 既存バグを検索してもそれっぽいのが無かったので普通にバグ報告をしました。
Report Classificationを書くときにちょっと迷うのがComponent/Subcomponentに自分のイメージしたやつがないときなんですが、
間違った選択をして報告をしてしまっても、良い感じに修正してくれるのが良いなぁと思いました。
実際、今回のチケットではjavaコマンドだったのでtoolsのlauncherがそれっぽいかな?とか思っていたのですが、報告後にhotspot/runtimeに修正されていました。
(こういうのってどこで調べれば良いのかがわからない。。。)
バグ報告をすると、Oracleによるレビューが入った上でJDK Bug SystemとOracle Java Bug Databaseに公開されるという流れになるみたいです。
私の場合、報告してから公開されるまで1日ぐらいかかりました。 OracleかOpenJDKのサイトで見たような気がしますが、セキュリティ的な理由とかで すぐ公開しちゃまずいバグかどうか等をレビューして判断しているみたいですね。
昨日のこれチケットになったhttps://t.co/NMeODm21YR
— noko(バイトコードになりたいイッヌ) (@noko_k) 2018年5月30日
報告してから解決に向かうまで
報告者には、バグ報告ページで入力したメールアドレスにこのようなメールが届きます。
記載されているURLを見て、初めて重複バグなのか等がわかるという感じですね。 バグに関する調査や、修正作業はバグチケット上のコメントでやり取りされ、他のチケットの関連付けや修正方法の検討がどんどん進んでいきます。
ところで、「Assigneeに記載されている方の名前、どこかで見たことある気がする...」と思ってググったら、この本を書いた方でした。なんかすごい方っぽい....!
https://www.amazon.co.jp/Programming-Language-Gosling-Holmes-Arnold/dp/0321349806
私の報告したバグが、Oracleのすごいエンジニアによって徐々に紐解かれていくようのは、見ててとても楽しいものですね。
このコメントが投下されたのを見たときは思わず「おぉー!」っとなり、しばらくしてリポジトリに修正がpushされたのを確認して二度「おぉ〜!」となったのは、今まで無かった体験でした。
The SEGV was introduced with the fuzzy matching flag logic refactoring in JDK-8198554. In:
Proposed fix has three parts:
- Update StringUtils::similarity to assert the two strings are not NULL and not zero-length.
- Update Arguments::process_argument to not call fuzzy_match for a zero-length arg.
- Update match_jfr_option to not trip-over the zero-length arg. (Still not quite sure why it does what it does there.)
修正コミット: jdk/jdk: 01e20d8850e3
OpenJDK 11(jdk-11-ea+17) では
修正されていることが確認できました🎉
> /opt/jdk-11-ea15/bin/java -XX: Unrecognized VM option '' fish: '/opt/jdk-11-ea15/bin/java -XX:' terminated by signal SIGSEGV (Address boundary error) > /opt/jdk-11-ea17/bin/java -XX: Unrecognized VM option '' Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.
おわりに
以上、バグの発見からその報告、解決までを体験できたのでそれを記事にしました。
バグ報告をすると今までにない体験を得られ、英語が書けなくてもコードは伝わる(もちろんちゃんと書けるならそのほうが良い)、ちゃんと修正されるというのが一番の収穫でした。 修正のスピード感も想像よりもずっと速くて、流れも全部コメントで追えることができてというのも良い体験でした。
今度はバグレポと一緒にパッチを送信できるようになりたいなぁという気持ちになったので、のんびり頑張っていきたいと思います。