ART: Change RETURN_OBJECT verification for arrays
Arrays appear to be valid (as according to spec), even if their
components are erroneous. If a component is erroneous, it may not
have loaded superclass or interface information, and so fail a
direct check for assignability.
Add a cutout that checks whether the declared return-type or the
actual return-type are arrays with erroneous components (and if so,
have the same 'depth'). In that case, generate a soft instead of a
hard error.
Also includes a fix to DumpClass.
Bug: 19683465
Change-Id: Ie73de03adeb0af7e939370d7363684fe125d7994
diff --git a/runtime/verifier/method_verifier.cc b/runtime/verifier/method_verifier.cc
index 47e9bf5..988fc0e 100644
--- a/runtime/verifier/method_verifier.cc
+++ b/runtime/verifier/method_verifier.cc
@@ -1752,8 +1752,21 @@
Fail(VERIFY_ERROR_NO_CLASS) << " can't resolve returned type '" << return_type
<< "' or '" << reg_type << "'";
} else {
- Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "returning '" << reg_type
- << "', but expected from declaration '" << return_type << "'";
+ bool soft_error = false;
+ // Check whether arrays are involved. They will show a valid class status, even
+ // if their components are erroneous.
+ if (reg_type.IsArrayTypes() && return_type.IsArrayTypes()) {
+ return_type.CanAssignArray(reg_type, reg_types_, class_loader_, &soft_error);
+ if (soft_error) {
+ Fail(VERIFY_ERROR_BAD_CLASS_SOFT) << "array with erroneous component type: "
+ << reg_type << " vs " << return_type;
+ }
+ }
+
+ if (!soft_error) {
+ Fail(VERIFY_ERROR_BAD_CLASS_HARD) << "returning '" << reg_type
+ << "', but expected from declaration '" << return_type << "'";
+ }
}
}
}