method_verifier_test.cc revision 53e32d14d7a51198c6ef09120c15bafdd1d055c2
13b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich/* 23b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * Copyright (C) 2011 The Android Open Source Project 33b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * 43b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * Licensed under the Apache License, Version 2.0 (the "License"); 53b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * you may not use this file except in compliance with the License. 63b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * You may obtain a copy of the License at 73b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * 83b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * http://www.apache.org/licenses/LICENSE-2.0 93b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * 103b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * Unless required by applicable law or agreed to in writing, software 113b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * distributed under the License is distributed on an "AS IS" BASIS, 123b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f960d89a7b197fe3b3bd28546c6c89c2331b9f14Jakob Juelich * See the License for the specific language governing permissions and 143b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich * limitations under the License. 153b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich */ 163b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 173b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich#include "method_verifier.h" 183b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 193b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich#include <stdio.h> 20f960d89a7b197fe3b3bd28546c6c89c2331b9f14Jakob Juelich#include <memory> 213b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 223b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich#include "class_linker-inl.h" 235949b4af7a872aeb58e7ad29090812d648725ed5Prashanth Balasubramanian#include "common_runtime_test.h" 248421d5905ab0aed8689c2eea6be8d9c4042ce618Jakob Juelich#include "dex_file.h" 253b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich#include "scoped_thread_state_change.h" 263b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 273b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelichnamespace art { 283b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelichnamespace verifier { 293b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 303b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelichclass MethodVerifierTest : public CommonRuntimeTest { 313b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich protected: 323b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich void VerifyClass(const std::string& descriptor) 333b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich SHARED_REQUIRES(Locks::mutator_lock_) { 343b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich ASSERT_TRUE(descriptor != nullptr); 353b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich Thread* self = Thread::Current(); 363b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich mirror::Class* klass = class_linker_->FindSystemClass(self, descriptor.c_str()); 373b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 383b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich // Verify the class 393b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich std::string error_msg; 403b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich ASSERT_TRUE(MethodVerifier::VerifyClass(self, klass, nullptr, true, true, &error_msg) 413b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich == MethodVerifier::kNoFailure) << error_msg; 423b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich } 433b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 443b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich void VerifyDexFile(const DexFile& dex) 453b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich SHARED_REQUIRES(Locks::mutator_lock_) { 463b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich // Verify all the classes defined in this file 471b52574752be108a743d3b33561c34324f8538e7Jakob Juelich for (size_t i = 0; i < dex.NumClassDefs(); i++) { 481b52574752be108a743d3b33561c34324f8538e7Jakob Juelich const DexFile::ClassDef& class_def = dex.GetClassDef(i); 491b52574752be108a743d3b33561c34324f8538e7Jakob Juelich const char* descriptor = dex.GetClassDescriptor(class_def); 501b52574752be108a743d3b33561c34324f8538e7Jakob Juelich VerifyClass(descriptor); 511b52574752be108a743d3b33561c34324f8538e7Jakob Juelich } 521b52574752be108a743d3b33561c34324f8538e7Jakob Juelich } 533b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich}; 543b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 553b27dbc2358aef655e050a92510ff8e9e080bf81Jakob JuelichTEST_F(MethodVerifierTest, LibCore) { 563b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich ScopedObjectAccess soa(Thread::Current()); 571b52574752be108a743d3b33561c34324f8538e7Jakob Juelich ASSERT_TRUE(java_lang_dex_file_ != nullptr); 581b52574752be108a743d3b33561c34324f8538e7Jakob Juelich VerifyDexFile(*java_lang_dex_file_); 591b52574752be108a743d3b33561c34324f8538e7Jakob Juelich} 603b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich 613b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich} // namespace verifier 623b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich} // namespace art 633b27dbc2358aef655e050a92510ff8e9e080bf81Jakob Juelich