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