Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Java をクラッシュさせて遊んでみよう!

474 views

Published on

OpenJDKのバグデータベースから見つけたバグを再現させて遊んでみました!

Published in: Technology
  • Be the first to comment

Java をクラッシュさせて遊んでみよう!

  1. 1. Java をクラッシュさせて 遊んでみよう! @YujiSoftware
  2. 2. Java をクラッシュさせる • Java はめったにクラッシュしない? • ところが、そうでもない! – 特に、新しい機能はバグがあったりする – 詳細は、バグデータベースに公開されている • 今日は、OpenJDK のバグデータベースから見 つけたバグを再現して遊んでみました!
  3. 3. コンパイラのバグ • JDK-8220018 • Switch式と try…catch…finaly の組 み合わせで、コンパイ ラがクラッシュする • 実際に Java13 で試し てみると… public class SwTest { public static void main(String[] args) { System.out.println(switch (0) { default -> { try { yield 1; } catch (Exception ex) { yield 2; } finally { yield 3; } } }); } }
  4. 4. 再現しない (´・ω・` ) •クラッシュしなかった – ちゃんとクラスファイルが生成された C:JDK-8220018>C:Program FilesJavajdk-13binjavac" -source 13 --enable-preview SwTest.java 注意:SwTest.javaはプレビュー言語機能を使用します。 注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。 C:JDK-8220018>dir 2019/11/23 01:33 605 SwTest.class 2019/11/23 01:33 400 SwTest.java 2 個のファイル 1,005 バイト 2 個のディレクトリ 24,369,549,312 バイトの空き領域
  5. 5. なぜ? • 最新(Java 13)で、すでに修正されていた – Java 12 で見つかったバグだった – クラッシュバグは、すぐに直される • 教訓 – バグレポートの修正バージョンや影響バージョン をよく確認しよう • 改めて、Java 12 でやってみると…
  6. 6. クラッシュした • スタックトレースを吐いて落ちる – 自らバグを認める C:JDK-8220018>“C:Program FilesJavajdk-12binjavac” -source 12 --enable-preview SwTest.java 注意:SwTest.javaはプレビュー言語機能を使用します。 注意:詳細は、-Xlint:previewオプションを指定して再コンパイルしてください。 コンパイラで例外が発生しました(12)。Bug Database (http://bugs.java.com)で 重複がないかをご確認のうえ、Java bugレポート・ページ (http://bugreport.java.com)でJavaコンパイラに対するbugの登録をお願いいた します。レポートには、そのプログラムと下記の診断内容を含めてくだ さい。ご 協力ありがとうございます。 java.lang.AssertionError at jdk.compiler/com.sun.tools.javac.util.Assert.error(Assert.java:155) at jdk.compiler/com.sun.tools.javac.util.Assert.check(Assert.java:46) at jdk.compiler/com.sun.tools.javac.jvm.Gen.visitBreak(Gen.java:1707) at jdk.compiler/com.sun.tools.javac.tree.JCTree$JCBreak.accept(JCTree.java:1561) at jdk.compiler/com.sun.tools.javac.jvm.Gen.genDef(Gen.java:595) at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:630) at jdk.compiler/com.sun.tools.javac.jvm.Gen.genStat(Gen.java:616)
  7. 7. Java VM のバグ • JDK-8226798 – JVM crash in klassItable::initialize_itable_for_interface(int, InstanceKlass*, bool, Thread*) – 影響バージョン:8, 11, 12.0.1, 13, 14 – 修正バージョン:14 • パッケージプライベートのメソッドと、 インタフェースのデフォルトメソッドの両方で 同じメソッドが定義されているなどの条件で、 実行時に Java VM がクラッシュするバグ
  8. 8. 再現コード • なぜかデフォルトメソッドが2つあると再現する らしい public class VTableTest { interface Intf { public default void m() { } public default void unusedButNeededToReproduceIssue() { } } static class B extends pkg.A implements Intf { } static class C extends B { public void m() { System.out.println("In C.m()"); } } public static void main(String[] args) { new C().m(); } } package pkg; public class A { void m() { } } !?
  9. 9. 実行結果 • EXCEPTION_ACCESS_VIOLATIONでクラッシュ C:JDK-8226798>"C:Program FilesJavajdk-13binjava" VTableTest # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8eaa6da4e, pid=11948, tid=13800 # # JRE version: OpenJDK Runtime Environment (13.0+33) (build 13+33) # Java VM: OpenJDK 64-Bit Server VM (13+33, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64) # Problematic frame: # V [jvm.dll+0x50da4e] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:JDK-8226798hs_err_pid11948.log # # If you would like to submit a bug report, please visit: # http://bugreport.java.com/bugreport/crash.jsp
  10. 10. 正しい挙動は? • バックポートされてる – クラッシュバグは修正してくれることが多い • なので、Java 11.0.5 では正しく動く – このバージョンで実行すると…!
  11. 11. 実行結果 •直ってなかった – 同じ理由でクラッシュする C:JDK-8226798>"C:Program FilesJavajdk-11.0.5binjava" VTableTest # # A fatal error has been detected by the Java Runtime Environment: # # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff8eaab927e, pid=14008, tid=10528 # # JRE version: Java(TM) SE Runtime Environment (11.0.5+10) (build 11.0.5+10-LTS) # Java VM: Java HotSpot(TM) 64-Bit Server VM (11.0.5+10-LTS, mixed mode, tiered, compressed oops, g1 gc, windows-amd64) # Problematic frame: # V [jvm.dll+0x51927e] # # No core dump will be written. Minidumps are not enabled by default on client versions of Windows # # An error report file with more information is saved as: # C:JDK-8226798hs_err_pid14008.log
  12. 12. なぜ直っていないのか • わからん (´・ω・`)
  13. 13. まとめ • Java はバージョンによってバグがある – 詳細はバグデータベースに公開されている • 実際に再現させてみると面白い – 思い通りにいかないことも多い • みなさんも、ぜひ遊んでみてください!
  14. 14. Java をクラッシュさせて 遊んでみよう! @YujiSoftware

×