Add a test to 536-checker-needs-access-check.
We are currently not inlining methods that failed access
checks during verification (soft-fail) but we're planning to
remove those checks from the verifier. Add a test case that
would expose a dex2oatd crash when we do so to make sure we
fix the crash when or before relaxing the verification.
Test: testrunner.py --host --optimizing -t 536
Test: Repeat the above with code modification to suppress
the soft-failure in the verifier:
- const RegType& res_type = ResolveClass<CheckAccess::kYes>(dex::TypeIndex(inst->VRegB_21c()));
+ bool hack = dex_file_->PrettyMethod(dex_method_idx_, false) ==
+ "other2.GetInaccessibleClass.get";
+ const RegType& res_type = hack
+ ? ResolveClass<CheckAccess::kNo>(dex::TypeIndex(inst->VRegB_21c()))
+ : ResolveClass<CheckAccess::kYes>(dex::TypeIndex(inst->VRegB_21c()));
dex2oatd crashes:
Check failed: !is_referrers_class || !needs_access_check
Bug: 28313047
Change-Id: I00707232b6027574a57aa8d43b790e346d8fd959
diff --git a/test/536-checker-needs-access-check/src/Main.java b/test/536-checker-needs-access-check/src/Main.java
index 7bd49c1..00934e4 100644
--- a/test/536-checker-needs-access-check/src/Main.java
+++ b/test/536-checker-needs-access-check/src/Main.java
@@ -42,6 +42,9 @@
} catch (IllegalAccessError e) {
System.out.println("Got expected error instanceof (keep LoadClass with access check)");
}
+
+ InaccessibleClassProxy.testGetReferrersClass();
+ InaccessibleClassProxy.testGetReferrersClassViaAnotherClass();
}
/// CHECK-START: boolean Main.testInstanceOf() register (after)
diff --git a/test/536-checker-needs-access-check/src/other/InaccessibleClass.java b/test/536-checker-needs-access-check/src/other/InaccessibleClass.java
index de2e1d7..ab2c9dd 100644
--- a/test/536-checker-needs-access-check/src/other/InaccessibleClass.java
+++ b/test/536-checker-needs-access-check/src/other/InaccessibleClass.java
@@ -17,4 +17,13 @@
package other;
public class InaccessibleClass {
+ public static Class<?> $noinline$getReferrersClass() {
+ // The actual test is in src2/ .
+ throw new Error("Unreachable");
+ }
+
+ public static Class<?> $noinline$getReferrersClassViaAnotherClass() {
+ // The actual test is in src2/ .
+ throw new Error("Unreachable");
+ }
}
diff --git a/test/536-checker-needs-access-check/src/other/InaccessibleClassProxy.java b/test/536-checker-needs-access-check/src/other/InaccessibleClassProxy.java
index 4c005e4..e69531b 100644
--- a/test/536-checker-needs-access-check/src/other/InaccessibleClassProxy.java
+++ b/test/536-checker-needs-access-check/src/other/InaccessibleClassProxy.java
@@ -20,4 +20,18 @@
public static boolean test(Object o) {
return o instanceof InaccessibleClass;
}
+
+ public static void testGetReferrersClass() {
+ Class<?> klass = InaccessibleClass.$noinline$getReferrersClass();
+ if (klass == null) {
+ throw new Error("Expected non-null klass");
+ }
+ }
+
+ public static void testGetReferrersClassViaAnotherClass() {
+ Class<?> klass = InaccessibleClass.$noinline$getReferrersClassViaAnotherClass();
+ if (klass != null) {
+ throw new Error("Expected non-null klass");
+ }
+ }
}
diff --git a/test/536-checker-needs-access-check/src2/other/InaccessibleClassProxy.java b/test/536-checker-needs-access-check/src/other2/GetInaccessibleClass.java
similarity index 62%
rename from test/536-checker-needs-access-check/src2/other/InaccessibleClassProxy.java
rename to test/536-checker-needs-access-check/src/other2/GetInaccessibleClass.java
index 4c005e4..172dbe5 100644
--- a/test/536-checker-needs-access-check/src2/other/InaccessibleClassProxy.java
+++ b/test/536-checker-needs-access-check/src/other2/GetInaccessibleClass.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2015 The Android Open Source Project
+ * Copyright (C) 2020 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,10 +14,14 @@
* limitations under the License.
*/
-package other;
+package other2;
-public class InaccessibleClassProxy {
- public static boolean test(Object o) {
- return o instanceof InaccessibleClass;
+import other.InaccessibleClass;
+
+public class GetInaccessibleClass {
+ // TODO: Make this method `$inline$` once we do not flag access check
+ // failures as soft-fail in the verifier. b/28313047
+ public static Class<?> get() {
+ return InaccessibleClass.class;
}
}
diff --git a/test/536-checker-needs-access-check/src2/other/InaccessibleClass.java b/test/536-checker-needs-access-check/src2/other/InaccessibleClass.java
index 2732263..743d1ff 100644
--- a/test/536-checker-needs-access-check/src2/other/InaccessibleClass.java
+++ b/test/536-checker-needs-access-check/src2/other/InaccessibleClass.java
@@ -16,5 +16,26 @@
package other;
+import other2.GetInaccessibleClass;
+
/*package*/ class InaccessibleClass {
+ /// CHECK-START: java.lang.Class other.InaccessibleClass.$noinline$getReferrersClass() builder (after)
+ /// CHECK: LoadClass class_name:other.InaccessibleClass needs_access_check:false
+ public static Class<?> $noinline$getReferrersClass() {
+ return InaccessibleClass.class;
+ }
+
+ /// CHECK-START: java.lang.Class other.InaccessibleClass.$noinline$getReferrersClassViaAnotherClass() builder (after)
+ // CHECK: LoadClass class_name:other.InaccessibleClass needs_access_check:true
+ public static Class<?> $noinline$getReferrersClassViaAnotherClass() {
+ // TODO: Make the called method `$inline$` and enable the CHECK above
+ // once we do not flag access check failures as soft-fail in the verifier.
+ // b/28313047
+ Class<?> klass = null;
+ try {
+ klass = GetInaccessibleClass.get();
+ throw new Error("Unreachable");
+ } catch (IllegalAccessError expected) {}
+ return klass;
+ }
}