From bdb540dc8d09c48ee19cf035f418bcae0f00660e Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Wed, 19 Apr 2017 13:50:34 +0100 Subject: Vdex: Workaround arrays with erroneous component type. The assignability DCHECK is only reliable when classes are not erroneous. For arrays whose component type could be erroneous, the verifier can join types even if they're not assignable. bug:33770646 Test: verifier_deps_test Change-Id: I4ec1b12b2e2c7d5b57b51a64aea381f951a38dcd --- compiler/verifier_deps_test.cc | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'compiler') diff --git a/compiler/verifier_deps_test.cc b/compiler/verifier_deps_test.cc index fa7e98586c..3b6b9cc7f0 100644 --- a/compiler/verifier_deps_test.cc +++ b/compiler/verifier_deps_test.cc @@ -207,9 +207,9 @@ class VerifierDepsTest : public CommonCompilerTest { ScopedObjectAccess soa(Thread::Current()); LoadDexFile(&soa); mirror::Class* klass_dst = FindClassByName(dst, &soa); - DCHECK(klass_dst != nullptr); + DCHECK(klass_dst != nullptr) << dst; mirror::Class* klass_src = FindClassByName(src, &soa); - DCHECK(klass_src != nullptr); + DCHECK(klass_src != nullptr) << src; verifier_deps_->AddAssignability(*primary_dex_file_, klass_dst, klass_src, @@ -1536,5 +1536,16 @@ TEST_F(VerifierDepsTest, NotAssignable_InterfaceWithClassInBoot) { ASSERT_TRUE(HasAssignable("Ljava/lang/Exception;", "LIface;", false)); } +TEST_F(VerifierDepsTest, Assignable_Arrays) { + ASSERT_TRUE(TestAssignabilityRecording(/* dst */ "[LIface;", + /* src */ "[LMyClassExtendingInterface;", + /* is_strict */ false, + /* is_assignable */ true)); + ASSERT_FALSE(HasAssignable( + "LIface;", "LMyClassExtendingInterface;", /* expected_is_assignable */ true)); + ASSERT_FALSE(HasAssignable( + "LIface;", "LMyClassExtendingInterface;", /* expected_is_assignable */ false)); +} + } // namespace verifier } // namespace art -- cgit v1.2.3-59-g8ed1b