From 3afff86e97c96128c005052cf86be9d2e52ea52b Mon Sep 17 00:00:00 2001 From: Peter Schrammel Date: Sun, 15 Apr 2018 17:20:21 +0100 Subject: [PATCH 1/3] Make disjuncts in virtual method removal independent of class loading The disjuncts created by virtual method removal depended on the class loading order, causing goto-diff to think that there was a change in the classes. --- src/goto-programs/remove_virtual_functions.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/goto-programs/remove_virtual_functions.cpp b/src/goto-programs/remove_virtual_functions.cpp index fad271b0d27..f3b53c57a9b 100644 --- a/src/goto-programs/remove_virtual_functions.cpp +++ b/src/goto-programs/remove_virtual_functions.cpp @@ -445,6 +445,8 @@ void remove_virtual_functionst::get_functions( has_prefix( id2string(b.symbol_expr.get_identifier()), "java::java.lang.Object")) return true; + else if(a.symbol_expr.get_identifier() == b.symbol_expr.get_identifier()) + return a.class_id < b.class_id; else return a.symbol_expr.get_identifier() < b.symbol_expr.get_identifier(); }); From b44589e6bebf64b7222ba3f4059135cb6a0955c8 Mon Sep 17 00:00:00 2001 From: Peter Schrammel Date: Mon, 16 Apr 2018 16:09:05 +0100 Subject: [PATCH 2/3] Make disjuncts in instanceof removal independent of class loading The disjuncts created by instanceof removal depended on the class loading order, causing goto-diff to think that there was a change in the classes. --- src/goto-programs/remove_instanceof.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/goto-programs/remove_instanceof.cpp b/src/goto-programs/remove_instanceof.cpp index 50166e33d03..e859c8d9384 100644 --- a/src/goto-programs/remove_instanceof.cpp +++ b/src/goto-programs/remove_instanceof.cpp @@ -87,6 +87,14 @@ std::size_t remove_instanceoft::lower_instanceof( std::vector children= class_hierarchy.get_children_trans(target_name); children.push_back(target_name); + // Sort alphabetically to make order of generated disjuncts + // independent of class loading order + std::sort( + children.begin(), + children.end(), + [](const irep_idt &a, const irep_idt &b) { // NOLINT + return a.compare(b) < 0; + }); // Insert an instruction before the new check that assigns the clsid we're // checking for to a temporary, as GOTO program if-expressions should From 4222a940748523f075d8a15bb4e10275f12dfcc9 Mon Sep 17 00:00:00 2001 From: Peter Schrammel Date: Sun, 15 Apr 2018 17:54:59 +0100 Subject: [PATCH 3/3] Regression tests for unstable instanceof and virtual method disjuncts --- regression/goto-diff/java-instanceof/new.jar | Bin 0 -> 1184 bytes .../goto-diff/java-instanceof/new/Test.java | 16 ++++++++++++ regression/goto-diff/java-instanceof/old.jar | Bin 0 -> 1179 bytes .../goto-diff/java-instanceof/old/Test.java | 22 ++++++++++++++++ .../goto-diff/java-instanceof/test.desc | 10 ++++++++ .../goto-diff/java-virtual-methods/new.jar | Bin 0 -> 1215 bytes .../java-virtual-methods/new/Test.java | 18 +++++++++++++ .../goto-diff/java-virtual-methods/old.jar | Bin 0 -> 1217 bytes .../java-virtual-methods/old/Test.java | 24 ++++++++++++++++++ .../goto-diff/java-virtual-methods/test.desc | 10 ++++++++ 10 files changed, 100 insertions(+) create mode 100644 regression/goto-diff/java-instanceof/new.jar create mode 100644 regression/goto-diff/java-instanceof/new/Test.java create mode 100644 regression/goto-diff/java-instanceof/old.jar create mode 100644 regression/goto-diff/java-instanceof/old/Test.java create mode 100644 regression/goto-diff/java-instanceof/test.desc create mode 100644 regression/goto-diff/java-virtual-methods/new.jar create mode 100644 regression/goto-diff/java-virtual-methods/new/Test.java create mode 100644 regression/goto-diff/java-virtual-methods/old.jar create mode 100644 regression/goto-diff/java-virtual-methods/old/Test.java create mode 100644 regression/goto-diff/java-virtual-methods/test.desc diff --git a/regression/goto-diff/java-instanceof/new.jar b/regression/goto-diff/java-instanceof/new.jar new file mode 100644 index 0000000000000000000000000000000000000000..bc067de9a6aacfd63b49bdc8e13d69931683614a GIT binary patch literal 1184 zcmWIWW@Zs#;Nak3Fz)X6VL$?$3@i-3t|5-Po_=on|4uP5Ff#;rvvYt{FhP|C;M6Pv zQ~}rQ>*(j{<{BKL=j-;__snS@Z(Y5MyxzK6=gyqp9At3C_`%a6JuhD!Pv48Bt5`TA zUPvC1o+YK3@k3ly?fDWdi|68^PsCNHFG9*Tjfejqs$a0sXrsZ#ukM2B`g@Yn z?(dm-^55Kj^$cGMMGrbVFI;&cXom>P_sDruof~hz+rzP^{n1&DS&wzh{db2ZnHkU3 zS-IoAt7Cb!jZ{e->&GouUM4NN{=C>kw`}$mo3t{{^t9-EXTL6Aci3HFg5d168X1v0 zw_o|`{@!xt>@7!lWB#4&W8PS|=uw%k*rxj5td^e?cPOw;UD2VqX!BP8vJ+e1>CdsP zdH+Cem7R3P2Kg;oS0p++7bqzje?2AgpBa=}{CgvW9|8R>#|TQNj7%a7sF@9xlR%jb z6~J>3DC?nXMNa;ptcC!#Kqg!(QpQ6z0hCRUlN>0UAi!ZD6PjtzH6h0{s-}rR|3T9x ix+dfx03`tg2n6~bkst!RS=m5xtUxFaG%lMN!~+0P23?*2 literal 0 HcmV?d00001 diff --git a/regression/goto-diff/java-instanceof/new/Test.java b/regression/goto-diff/java-instanceof/new/Test.java new file mode 100644 index 00000000000..0bd39087a0b --- /dev/null +++ b/regression/goto-diff/java-instanceof/new/Test.java @@ -0,0 +1,16 @@ +class A { +} + +class B extends A { +} + +public class Test { + + public boolean foo(A x) { + if (x instanceof A) { + return true; + } else { + return false; + } + } +} diff --git a/regression/goto-diff/java-instanceof/old.jar b/regression/goto-diff/java-instanceof/old.jar new file mode 100644 index 0000000000000000000000000000000000000000..25aba503dd7a55e674cda857c9db88e9f0db1b58 GIT binary patch literal 1179 zcmWIWW@Zs#;Nak3nAqFz!+-=h8CV#6T|*poJ^kGD|D9rBU}gyLX6FE@V1g+W;XlGo-;z$Zft41XARug#Ge0| z65_^IH~-9@ko}kLEV;61!jUC13pm0H>M{e1Rz<6I9G09E6|-pi)QD*(4j(vl;M9o& zFIbNB@o@3@IBa%o5bS6)a+t+?ViM~m1;MbjZ+Uv84_gB^fzZ7i|DVcOCMSuIVwUvF7i*}!U zo-KX-TRnBD+H?aA0|UmljErsy zY+5XravY}VOknHWkd>RBaED`B8vCT21jh*?>=V+G9}j?^q2uVm1Dv5+ ztf8ll>|yhj^)OE4rq)xKbwf@lHYu99NeLermAnj4fZ*EX#I@orR zzqy(6}yU5Dx&* CgJ%2y literal 0 HcmV?d00001 diff --git a/regression/goto-diff/java-virtual-methods/new/Test.java b/regression/goto-diff/java-virtual-methods/new/Test.java new file mode 100644 index 00000000000..a048bc7cf61 --- /dev/null +++ b/regression/goto-diff/java-virtual-methods/new/Test.java @@ -0,0 +1,18 @@ +class A { + boolean bar() { + return true; + } +} + +class B extends A { + boolean bar() { + return false; + } +} + +public class Test { + + public boolean foo(A x) { + return x.bar(); + } +} diff --git a/regression/goto-diff/java-virtual-methods/old.jar b/regression/goto-diff/java-virtual-methods/old.jar new file mode 100644 index 0000000000000000000000000000000000000000..fdea5e45df83ca4d110a6075f9bada90768ab6ff GIT binary patch literal 1217 zcmWIWW@Zs#;Nak3=*(j{<{BKL=j-;__snS@Z(Y5MyxzK6=gyqp9At3C_`%a6JuhD!Pv48Bt5`TA zUPvC1o+YK3@k3ly?fDWdi|68^PsCNHFD=ecaPSO#?X4ZL3C0?LM@7MDPL7wfm1k1nbq^>rZ zmt6+CcDwLe)i3j6UdiJ&dAnBmBe{G#2Xi?NPB&$x?jFww`!L_g=<