xref: /aosp_15_r20/art/libdexfile/dex/dex_file_verifier_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2011 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "dex_file_verifier.h"
18*795d594fSAndroid Build Coastguard Worker 
19*795d594fSAndroid Build Coastguard Worker #include <zlib.h>
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker #include <functional>
22*795d594fSAndroid Build Coastguard Worker #include <memory>
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker #include <android-base/logging.h>
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker #include "base/bit_utils.h"
27*795d594fSAndroid Build Coastguard Worker #include "base/leb128.h"
28*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
29*795d594fSAndroid Build Coastguard Worker #include "base64_test_util.h"
30*795d594fSAndroid Build Coastguard Worker #include "class_accessor-inl.h"
31*795d594fSAndroid Build Coastguard Worker #include "descriptors_names.h"
32*795d594fSAndroid Build Coastguard Worker #include "dex_file-inl.h"
33*795d594fSAndroid Build Coastguard Worker #include "dex_file_loader.h"
34*795d594fSAndroid Build Coastguard Worker #include "dex_file_types.h"
35*795d594fSAndroid Build Coastguard Worker #include "gtest/gtest.h"
36*795d594fSAndroid Build Coastguard Worker #include "standard_dex_file.h"
37*795d594fSAndroid Build Coastguard Worker 
38*795d594fSAndroid Build Coastguard Worker namespace art {
39*795d594fSAndroid Build Coastguard Worker 
40*795d594fSAndroid Build Coastguard Worker static constexpr char kLocationString[] = "dex_file_location";
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker // Make the Dex file version 37.
MakeDexVersion37(DexFile * dex_file)43*795d594fSAndroid Build Coastguard Worker static void MakeDexVersion37(DexFile* dex_file) {
44*795d594fSAndroid Build Coastguard Worker   size_t offset = OFFSETOF_MEMBER(DexFile::Header, magic_) + 6;
45*795d594fSAndroid Build Coastguard Worker   CHECK_EQ(*(dex_file->Begin() + offset), '5');
46*795d594fSAndroid Build Coastguard Worker   *(const_cast<uint8_t*>(dex_file->Begin()) + offset) = '7';
47*795d594fSAndroid Build Coastguard Worker }
48*795d594fSAndroid Build Coastguard Worker 
FixUpChecksum(uint8_t * dex_file)49*795d594fSAndroid Build Coastguard Worker static void FixUpChecksum(uint8_t* dex_file) {
50*795d594fSAndroid Build Coastguard Worker   DexFile::Header* header = reinterpret_cast<DexFile::Header*>(dex_file);
51*795d594fSAndroid Build Coastguard Worker   uint32_t expected_size = header->file_size_;
52*795d594fSAndroid Build Coastguard Worker   uint32_t adler_checksum = adler32(0L, Z_NULL, 0);
53*795d594fSAndroid Build Coastguard Worker   const uint32_t non_sum = sizeof(DexFile::Header::magic_) + sizeof(DexFile::Header::checksum_);
54*795d594fSAndroid Build Coastguard Worker   const uint8_t* non_sum_ptr = dex_file + non_sum;
55*795d594fSAndroid Build Coastguard Worker   adler_checksum = adler32(adler_checksum, non_sum_ptr, expected_size - non_sum);
56*795d594fSAndroid Build Coastguard Worker   header->checksum_ = adler_checksum;
57*795d594fSAndroid Build Coastguard Worker }
58*795d594fSAndroid Build Coastguard Worker 
59*795d594fSAndroid Build Coastguard Worker class DexFileVerifierTest : public testing::Test {
60*795d594fSAndroid Build Coastguard Worker  protected:
GetDexFile(const uint8_t * dex_bytes,size_t length)61*795d594fSAndroid Build Coastguard Worker   DexFile* GetDexFile(const uint8_t* dex_bytes, size_t length) {
62*795d594fSAndroid Build Coastguard Worker     auto container = std::make_shared<MemoryDexFileContainer>(dex_bytes, length);
63*795d594fSAndroid Build Coastguard Worker     return new StandardDexFile(dex_bytes, "tmp", 0, nullptr, std::move(container));
64*795d594fSAndroid Build Coastguard Worker   }
65*795d594fSAndroid Build Coastguard Worker 
VerifyModification(const char * dex_file_base64_content,const char * location,const std::function<void (DexFile *)> & f,const char * expected_error)66*795d594fSAndroid Build Coastguard Worker   void VerifyModification(const char* dex_file_base64_content,
67*795d594fSAndroid Build Coastguard Worker                           const char* location,
68*795d594fSAndroid Build Coastguard Worker                           const std::function<void(DexFile*)>& f,
69*795d594fSAndroid Build Coastguard Worker                           const char* expected_error) {
70*795d594fSAndroid Build Coastguard Worker     size_t length;
71*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(dex_file_base64_content, &length));
72*795d594fSAndroid Build Coastguard Worker     CHECK(dex_bytes != nullptr);
73*795d594fSAndroid Build Coastguard Worker     // Note: `dex_file` will be destroyed before `dex_bytes`.
74*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
75*795d594fSAndroid Build Coastguard Worker     f(dex_file.get());
76*795d594fSAndroid Build Coastguard Worker     FixUpChecksum(const_cast<uint8_t*>(dex_file->Begin()));
77*795d594fSAndroid Build Coastguard Worker 
78*795d594fSAndroid Build Coastguard Worker     static constexpr bool kVerifyChecksum = true;
79*795d594fSAndroid Build Coastguard Worker     std::string error_msg;
80*795d594fSAndroid Build Coastguard Worker     bool success = dex::Verify(dex_file.get(), location, kVerifyChecksum, &error_msg);
81*795d594fSAndroid Build Coastguard Worker     if (expected_error == nullptr) {
82*795d594fSAndroid Build Coastguard Worker       EXPECT_TRUE(success) << error_msg;
83*795d594fSAndroid Build Coastguard Worker     } else {
84*795d594fSAndroid Build Coastguard Worker       EXPECT_FALSE(success) << "Expected " << expected_error;
85*795d594fSAndroid Build Coastguard Worker       if (!success) {
86*795d594fSAndroid Build Coastguard Worker         EXPECT_NE(error_msg.find(expected_error), std::string::npos) << error_msg;
87*795d594fSAndroid Build Coastguard Worker       }
88*795d594fSAndroid Build Coastguard Worker     }
89*795d594fSAndroid Build Coastguard Worker   }
90*795d594fSAndroid Build Coastguard Worker };
91*795d594fSAndroid Build Coastguard Worker 
OpenDexFileBase64(const char * base64,const char * location,std::string * error_msg)92*795d594fSAndroid Build Coastguard Worker static std::unique_ptr<const DexFile> OpenDexFileBase64(const char* base64,
93*795d594fSAndroid Build Coastguard Worker                                                         const char* location,
94*795d594fSAndroid Build Coastguard Worker                                                         std::string* error_msg) {
95*795d594fSAndroid Build Coastguard Worker   // decode base64
96*795d594fSAndroid Build Coastguard Worker   CHECK(base64 != nullptr);
97*795d594fSAndroid Build Coastguard Worker   size_t length;
98*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(base64, &length));
99*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes.get() != nullptr);
100*795d594fSAndroid Build Coastguard Worker 
101*795d594fSAndroid Build Coastguard Worker   // read dex
102*795d594fSAndroid Build Coastguard Worker   std::vector<std::unique_ptr<const DexFile>> tmp;
103*795d594fSAndroid Build Coastguard Worker   DexFileLoader dex_file_loader(dex_bytes.get(), length, location);
104*795d594fSAndroid Build Coastguard Worker   DexFileLoaderErrorCode error_code;
105*795d594fSAndroid Build Coastguard Worker   bool success = dex_file_loader.Open(/* verify= */ true,
106*795d594fSAndroid Build Coastguard Worker                                       /* verify_checksum= */ true,
107*795d594fSAndroid Build Coastguard Worker                                       &error_code,
108*795d594fSAndroid Build Coastguard Worker                                       error_msg,
109*795d594fSAndroid Build Coastguard Worker                                       &tmp);
110*795d594fSAndroid Build Coastguard Worker   CHECK(success) << *error_msg;
111*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(1U, tmp.size());
112*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> dex_file = std::move(tmp[0]);
113*795d594fSAndroid Build Coastguard Worker   return dex_file;
114*795d594fSAndroid Build Coastguard Worker }
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker // To generate a base64 encoded Dex file (such as kGoodTestDex, below)
117*795d594fSAndroid Build Coastguard Worker // from Smali files, use:
118*795d594fSAndroid Build Coastguard Worker //
119*795d594fSAndroid Build Coastguard Worker //   smali assemble -o classes.dex class1.smali [class2.smali ...]
120*795d594fSAndroid Build Coastguard Worker //   base64 classes.dex >classes.dex.base64
121*795d594fSAndroid Build Coastguard Worker 
122*795d594fSAndroid Build Coastguard Worker // For reference.
123*795d594fSAndroid Build Coastguard Worker static const char kGoodTestDex[] =
124*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQDrVbyVkxX1HljTznNf95AglkUAhQuFtmKkAgAAcAAAAHhWNBIAAAAAAAAAAAQCAAAN"
125*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAYAAACkAAAAAgAAALwAAAABAAAA1AAAAAQAAADcAAAAAQAAAPwAAACIAQAAHAEAAFoB"
126*795d594fSAndroid Build Coastguard Worker     "AABiAQAAagEAAIEBAACVAQAAqQEAAL0BAADDAQAAzgEAANEBAADVAQAA2gEAAN8BAAABAAAAAgAA"
127*795d594fSAndroid Build Coastguard Worker     "AAMAAAAEAAAABQAAAAgAAAAIAAAABQAAAAAAAAAJAAAABQAAAFQBAAAEAAEACwAAAAAAAAAAAAAA"
128*795d594fSAndroid Build Coastguard Worker     "AAAAAAoAAAABAAEADAAAAAIAAAAAAAAAAAAAAAEAAAACAAAAAAAAAAcAAAAAAAAA8wEAAAAAAAAB"
129*795d594fSAndroid Build Coastguard Worker     "AAEAAQAAAOgBAAAEAAAAcBADAAAADgACAAAAAgAAAO0BAAAIAAAAYgAAABoBBgBuIAIAEAAOAAEA"
130*795d594fSAndroid Build Coastguard Worker     "AAADAAY8aW5pdD4ABkxUZXN0OwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABJMamF2YS9sYW5nL09i"
131*795d594fSAndroid Build Coastguard Worker     "amVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07AARUZXN0AAlUZXN0"
132*795d594fSAndroid Build Coastguard Worker     "LmphdmEAAVYAAlZMAANmb28AA291dAAHcHJpbnRsbgABAAcOAAMABw54AAAAAgAAgYAEnAIBCbQC"
133*795d594fSAndroid Build Coastguard Worker     "AAAADQAAAAAAAAABAAAAAAAAAAEAAAANAAAAcAAAAAIAAAAGAAAApAAAAAMAAAACAAAAvAAAAAQA"
134*795d594fSAndroid Build Coastguard Worker     "AAABAAAA1AAAAAUAAAAEAAAA3AAAAAYAAAABAAAA/AAAAAEgAAACAAAAHAEAAAEQAAABAAAAVAEA"
135*795d594fSAndroid Build Coastguard Worker     "AAIgAAANAAAAWgEAAAMgAAACAAAA6AEAAAAgAAABAAAA8wEAAAAQAAABAAAABAIAAA==";
136*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,GoodDex)137*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, GoodDex) {
138*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
139*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kGoodTestDex,
140*795d594fSAndroid Build Coastguard Worker                                                        kLocationString,
141*795d594fSAndroid Build Coastguard Worker                                                        &error_msg));
142*795d594fSAndroid Build Coastguard Worker   ASSERT_TRUE(raw.get() != nullptr) << error_msg;
143*795d594fSAndroid Build Coastguard Worker }
144*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,MethodId)145*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, MethodId) {
146*795d594fSAndroid Build Coastguard Worker   // Class idx error.
147*795d594fSAndroid Build Coastguard Worker   VerifyModification(
148*795d594fSAndroid Build Coastguard Worker       kGoodTestDex,
149*795d594fSAndroid Build Coastguard Worker       "method_id_class_idx",
150*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
151*795d594fSAndroid Build Coastguard Worker         dex::MethodId* method_id = const_cast<dex::MethodId*>(&dex_file->GetMethodId(0));
152*795d594fSAndroid Build Coastguard Worker         method_id->class_idx_ = dex::TypeIndex(0xFF);
153*795d594fSAndroid Build Coastguard Worker       },
154*795d594fSAndroid Build Coastguard Worker       "Bad index for method_id.class");
155*795d594fSAndroid Build Coastguard Worker 
156*795d594fSAndroid Build Coastguard Worker   // Proto idx error.
157*795d594fSAndroid Build Coastguard Worker   VerifyModification(
158*795d594fSAndroid Build Coastguard Worker       kGoodTestDex,
159*795d594fSAndroid Build Coastguard Worker       "method_id_proto_idx",
160*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
161*795d594fSAndroid Build Coastguard Worker         dex::MethodId* method_id = const_cast<dex::MethodId*>(&dex_file->GetMethodId(0));
162*795d594fSAndroid Build Coastguard Worker         method_id->proto_idx_ = dex::ProtoIndex(0xFF);
163*795d594fSAndroid Build Coastguard Worker       },
164*795d594fSAndroid Build Coastguard Worker       "Bad index for method_id.proto");
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker   // Name idx error.
167*795d594fSAndroid Build Coastguard Worker   VerifyModification(
168*795d594fSAndroid Build Coastguard Worker       kGoodTestDex,
169*795d594fSAndroid Build Coastguard Worker       "method_id_name_idx",
170*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
171*795d594fSAndroid Build Coastguard Worker         dex::MethodId* method_id = const_cast<dex::MethodId*>(&dex_file->GetMethodId(0));
172*795d594fSAndroid Build Coastguard Worker         method_id->name_idx_ = dex::StringIndex(0xFF);
173*795d594fSAndroid Build Coastguard Worker       },
174*795d594fSAndroid Build Coastguard Worker       "Bad index for method_id.name");
175*795d594fSAndroid Build Coastguard Worker }
176*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,InitCachingWithUnicode)177*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, InitCachingWithUnicode) {
178*795d594fSAndroid Build Coastguard Worker   static const char kInitWithUnicode[] =
179*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNQDhN60rgMnSK13MoRscTuD+NZe7f6rIkHAAAgAAcAAAAHhWNBIAAAAAAAAAAGwBAAAJ"
180*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAAMAAACUAAAAAQAAAKAAAAAAAAAAAAAAAAIAAACsAAAAAQAAALwAAAAkAQAA3AAAANwA"
181*795d594fSAndroid Build Coastguard Worker       "AADgAAAA5gAAAO4AAAD1AAAAAQEAABUBAAAgAQAAIwEAAAQAAAAFAAAABwAAAAcAAAACAAAAAAAA"
182*795d594fSAndroid Build Coastguard Worker       "AAAAAAACAAAAAQAAAAIAAAAAAAAAAAAAAAEAAAAAAAAABgAAAAAAAABgAQAAAAAAAAHAgAACwIDA"
183*795d594fSAndroid Build Coastguard Worker       "gAAGPGluaXQ+AAVIZWxsbwAKTFRlc3RTeW5jOwASTGphdmEvbGFuZy9PYmplY3Q7AAlNYWluLmph"
184*795d594fSAndroid Build Coastguard Worker       "dmEAAVYABVdvcmxkAAAAAAAAAAYABw4AAAAACgABAAEAAAAwAQAADAAAAHAQAQAJABoBAwAaAggA"
185*795d594fSAndroid Build Coastguard Worker       "GgMAABoEAQAOAAAAAQAAgIAEuAIAAAwAAAAAAAAAAQAAAAAAAAABAAAACQAAAHAAAAACAAAAAwAA"
186*795d594fSAndroid Build Coastguard Worker       "AJQAAAADAAAAAQAAAKAAAAAFAAAAAgAAAKwAAAAGAAAAAQAAALwAAAACIAAACQAAANwAAAADEAAA"
187*795d594fSAndroid Build Coastguard Worker       "AQAAACwBAAADIAAAAQAAADABAAABIAAAAQAAADgBAAAAIAAAAQAAAGABAAAAEAAAAQAAAGwBAAA=";
188*795d594fSAndroid Build Coastguard Worker   // Just ensure it verifies w/o modification.
189*795d594fSAndroid Build Coastguard Worker   VerifyModification(kInitWithUnicode, "init_with_unicode", [](DexFile*) {}, nullptr);
190*795d594fSAndroid Build Coastguard Worker }
191*795d594fSAndroid Build Coastguard Worker 
192*795d594fSAndroid Build Coastguard Worker // Method flags test class generated from the following smali code. The declared-synchronized
193*795d594fSAndroid Build Coastguard Worker // flags are there to enforce a 3-byte uLEB128 encoding so we don't have to relayout
194*795d594fSAndroid Build Coastguard Worker // the code, but we need to remove them before doing tests.
195*795d594fSAndroid Build Coastguard Worker //
196*795d594fSAndroid Build Coastguard Worker // .class public LMethodFlags;
197*795d594fSAndroid Build Coastguard Worker // .super Ljava/lang/Object;
198*795d594fSAndroid Build Coastguard Worker //
199*795d594fSAndroid Build Coastguard Worker // .method public static constructor <clinit>()V
200*795d594fSAndroid Build Coastguard Worker // .registers 1
201*795d594fSAndroid Build Coastguard Worker //     return-void
202*795d594fSAndroid Build Coastguard Worker // .end method
203*795d594fSAndroid Build Coastguard Worker //
204*795d594fSAndroid Build Coastguard Worker // .method public constructor <init>()V
205*795d594fSAndroid Build Coastguard Worker // .registers 1
206*795d594fSAndroid Build Coastguard Worker //     return-void
207*795d594fSAndroid Build Coastguard Worker // .end method
208*795d594fSAndroid Build Coastguard Worker //
209*795d594fSAndroid Build Coastguard Worker // .method private declared-synchronized foo()V
210*795d594fSAndroid Build Coastguard Worker // .registers 1
211*795d594fSAndroid Build Coastguard Worker //     return-void
212*795d594fSAndroid Build Coastguard Worker // .end method
213*795d594fSAndroid Build Coastguard Worker //
214*795d594fSAndroid Build Coastguard Worker // .method public declared-synchronized bar()V
215*795d594fSAndroid Build Coastguard Worker // .registers 1
216*795d594fSAndroid Build Coastguard Worker //     return-void
217*795d594fSAndroid Build Coastguard Worker // .end method
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker static const char kMethodFlagsTestDex[] =
220*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQCyOQrJaDBwiIWv5MIuYKXhxlLLsQcx5SwgAgAAcAAAAHhWNBIAAAAAAAAAAJgBAAAH"
221*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAMAAACMAAAAAQAAAJgAAAAAAAAAAAAAAAQAAACkAAAAAQAAAMQAAAA8AQAA5AAAAOQA"
222*795d594fSAndroid Build Coastguard Worker     "AADuAAAA9gAAAAUBAAAZAQAAHAEAACEBAAACAAAAAwAAAAQAAAAEAAAAAgAAAAAAAAAAAAAAAAAA"
223*795d594fSAndroid Build Coastguard Worker     "AAAAAAABAAAAAAAAAAUAAAAAAAAABgAAAAAAAAABAAAAAQAAAAAAAAD/////AAAAAHoBAAAAAAAA"
224*795d594fSAndroid Build Coastguard Worker     "CDxjbGluaXQ+AAY8aW5pdD4ADUxNZXRob2RGbGFnczsAEkxqYXZhL2xhbmcvT2JqZWN0OwABVgAD"
225*795d594fSAndroid Build Coastguard Worker     "YmFyAANmb28AAAAAAAAAAQAAAAAAAAAAAAAAAQAAAA4AAAABAAEAAAAAAAAAAAABAAAADgAAAAEA"
226*795d594fSAndroid Build Coastguard Worker     "AQAAAAAAAAAAAAEAAAAOAAAAAQABAAAAAAAAAAAAAQAAAA4AAAADAQCJgASsAgGBgATAAgKCgAjU"
227*795d594fSAndroid Build Coastguard Worker     "AgKBgAjoAgAACwAAAAAAAAABAAAAAAAAAAEAAAAHAAAAcAAAAAIAAAADAAAAjAAAAAMAAAABAAAA"
228*795d594fSAndroid Build Coastguard Worker     "mAAAAAUAAAAEAAAApAAAAAYAAAABAAAAxAAAAAIgAAAHAAAA5AAAAAMQAAABAAAAKAEAAAEgAAAE"
229*795d594fSAndroid Build Coastguard Worker     "AAAALAEAAAAgAAABAAAAegEAAAAQAAABAAAAmAEAAA==";
230*795d594fSAndroid Build Coastguard Worker 
231*795d594fSAndroid Build Coastguard Worker // Find the method data for the first method with the given name (from class 0). Note: the pointer
232*795d594fSAndroid Build Coastguard Worker // is to the access flags, so that the caller doesn't have to handle the leb128-encoded method-index
233*795d594fSAndroid Build Coastguard Worker // delta.
FindMethodData(const DexFile * dex_file,const char * name,uint32_t * method_idx=nullptr)234*795d594fSAndroid Build Coastguard Worker static const uint8_t* FindMethodData(const DexFile* dex_file,
235*795d594fSAndroid Build Coastguard Worker                                      const char* name,
236*795d594fSAndroid Build Coastguard Worker                                      /*out*/ uint32_t* method_idx = nullptr) {
237*795d594fSAndroid Build Coastguard Worker   ClassAccessor accessor(*dex_file, dex_file->GetClassDef(0));
238*795d594fSAndroid Build Coastguard Worker 
239*795d594fSAndroid Build Coastguard Worker   for (const ClassAccessor::Method& method : accessor.GetMethods()) {
240*795d594fSAndroid Build Coastguard Worker     uint32_t method_index = method.GetIndex();
241*795d594fSAndroid Build Coastguard Worker     dex::StringIndex name_index = dex_file->GetMethodId(method_index).name_idx_;
242*795d594fSAndroid Build Coastguard Worker     const dex::StringId& string_id = dex_file->GetStringId(name_index);
243*795d594fSAndroid Build Coastguard Worker     const char* str = dex_file->GetStringData(string_id);
244*795d594fSAndroid Build Coastguard Worker     if (strcmp(name, str) == 0) {
245*795d594fSAndroid Build Coastguard Worker       if (method_idx != nullptr) {
246*795d594fSAndroid Build Coastguard Worker         *method_idx = method_index;
247*795d594fSAndroid Build Coastguard Worker       }
248*795d594fSAndroid Build Coastguard Worker       // Go back 2 lebs to the access flags.
249*795d594fSAndroid Build Coastguard Worker       const uint8_t* trailing = ReverseSearchUnsignedLeb128(method.GetDataPointer());
250*795d594fSAndroid Build Coastguard Worker       trailing = ReverseSearchUnsignedLeb128(trailing);
251*795d594fSAndroid Build Coastguard Worker       return trailing;
252*795d594fSAndroid Build Coastguard Worker     }
253*795d594fSAndroid Build Coastguard Worker   }
254*795d594fSAndroid Build Coastguard Worker 
255*795d594fSAndroid Build Coastguard Worker   return nullptr;
256*795d594fSAndroid Build Coastguard Worker }
257*795d594fSAndroid Build Coastguard Worker 
258*795d594fSAndroid Build Coastguard Worker // Set the method flags to the given value.
SetMethodFlags(DexFile * dex_file,const char * method,uint32_t mask)259*795d594fSAndroid Build Coastguard Worker static void SetMethodFlags(DexFile* dex_file, const char* method, uint32_t mask) {
260*795d594fSAndroid Build Coastguard Worker   uint8_t* method_flags_ptr = const_cast<uint8_t*>(FindMethodData(dex_file, method));
261*795d594fSAndroid Build Coastguard Worker   CHECK(method_flags_ptr != nullptr) << method;
262*795d594fSAndroid Build Coastguard Worker 
263*795d594fSAndroid Build Coastguard Worker     // Unroll this, as we only have three bytes, anyways.
264*795d594fSAndroid Build Coastguard Worker   uint8_t base1 = static_cast<uint8_t>(mask & 0x7F);
265*795d594fSAndroid Build Coastguard Worker   *(method_flags_ptr++) = (base1 | 0x80);
266*795d594fSAndroid Build Coastguard Worker   mask >>= 7;
267*795d594fSAndroid Build Coastguard Worker 
268*795d594fSAndroid Build Coastguard Worker   uint8_t base2 = static_cast<uint8_t>(mask & 0x7F);
269*795d594fSAndroid Build Coastguard Worker   *(method_flags_ptr++) = (base2 | 0x80);
270*795d594fSAndroid Build Coastguard Worker   mask >>= 7;
271*795d594fSAndroid Build Coastguard Worker 
272*795d594fSAndroid Build Coastguard Worker   uint8_t base3 = static_cast<uint8_t>(mask & 0x7F);
273*795d594fSAndroid Build Coastguard Worker   *method_flags_ptr = base3;
274*795d594fSAndroid Build Coastguard Worker }
275*795d594fSAndroid Build Coastguard Worker 
GetMethodFlags(DexFile * dex_file,const char * method)276*795d594fSAndroid Build Coastguard Worker static uint32_t GetMethodFlags(DexFile* dex_file, const char* method) {
277*795d594fSAndroid Build Coastguard Worker   const uint8_t* method_flags_ptr = const_cast<uint8_t*>(FindMethodData(dex_file, method));
278*795d594fSAndroid Build Coastguard Worker   CHECK(method_flags_ptr != nullptr) << method;
279*795d594fSAndroid Build Coastguard Worker   return DecodeUnsignedLeb128(&method_flags_ptr);
280*795d594fSAndroid Build Coastguard Worker }
281*795d594fSAndroid Build Coastguard Worker 
282*795d594fSAndroid Build Coastguard Worker // Apply the given mask to method flags.
ApplyMaskToMethodFlags(DexFile * dex_file,const char * method,uint32_t mask)283*795d594fSAndroid Build Coastguard Worker static void ApplyMaskToMethodFlags(DexFile* dex_file, const char* method, uint32_t mask) {
284*795d594fSAndroid Build Coastguard Worker   uint32_t value = GetMethodFlags(dex_file, method);
285*795d594fSAndroid Build Coastguard Worker   value &= mask;
286*795d594fSAndroid Build Coastguard Worker   SetMethodFlags(dex_file, method, value);
287*795d594fSAndroid Build Coastguard Worker }
288*795d594fSAndroid Build Coastguard Worker 
289*795d594fSAndroid Build Coastguard Worker // Apply the given mask to method flags.
OrMaskToMethodFlags(DexFile * dex_file,const char * method,uint32_t mask)290*795d594fSAndroid Build Coastguard Worker static void OrMaskToMethodFlags(DexFile* dex_file, const char* method, uint32_t mask) {
291*795d594fSAndroid Build Coastguard Worker   uint32_t value = GetMethodFlags(dex_file, method);
292*795d594fSAndroid Build Coastguard Worker   value |= mask;
293*795d594fSAndroid Build Coastguard Worker   SetMethodFlags(dex_file, method, value);
294*795d594fSAndroid Build Coastguard Worker }
295*795d594fSAndroid Build Coastguard Worker 
296*795d594fSAndroid Build Coastguard Worker // Set code_off to 0 for the method.
RemoveCode(DexFile * dex_file,const char * method)297*795d594fSAndroid Build Coastguard Worker static void RemoveCode(DexFile* dex_file, const char* method) {
298*795d594fSAndroid Build Coastguard Worker   const uint8_t* ptr = FindMethodData(dex_file, method);
299*795d594fSAndroid Build Coastguard Worker   // Next is flags, pass.
300*795d594fSAndroid Build Coastguard Worker   DecodeUnsignedLeb128(&ptr);
301*795d594fSAndroid Build Coastguard Worker 
302*795d594fSAndroid Build Coastguard Worker   // Figure out how many bytes the code_off is.
303*795d594fSAndroid Build Coastguard Worker   const uint8_t* tmp = ptr;
304*795d594fSAndroid Build Coastguard Worker   DecodeUnsignedLeb128(&tmp);
305*795d594fSAndroid Build Coastguard Worker   size_t bytes = tmp - ptr;
306*795d594fSAndroid Build Coastguard Worker 
307*795d594fSAndroid Build Coastguard Worker   uint8_t* mod = const_cast<uint8_t*>(ptr);
308*795d594fSAndroid Build Coastguard Worker   for (size_t i = 1; i < bytes; ++i) {
309*795d594fSAndroid Build Coastguard Worker     *(mod++) = 0x80;
310*795d594fSAndroid Build Coastguard Worker   }
311*795d594fSAndroid Build Coastguard Worker   *mod = 0x00;
312*795d594fSAndroid Build Coastguard Worker }
313*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,MethodAccessFlagsBase)314*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, MethodAccessFlagsBase) {
315*795d594fSAndroid Build Coastguard Worker   // Check that it's OK when the wrong declared-synchronized flag is removed from "foo."
316*795d594fSAndroid Build Coastguard Worker   VerifyModification(
317*795d594fSAndroid Build Coastguard Worker       kMethodFlagsTestDex,
318*795d594fSAndroid Build Coastguard Worker       "method_flags_ok",
319*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
320*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
321*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
322*795d594fSAndroid Build Coastguard Worker       },
323*795d594fSAndroid Build Coastguard Worker       nullptr);
324*795d594fSAndroid Build Coastguard Worker }
325*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,MethodAccessFlagsConstructors)326*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, MethodAccessFlagsConstructors) {
327*795d594fSAndroid Build Coastguard Worker   // Make sure we still accept constructors without their flags.
328*795d594fSAndroid Build Coastguard Worker   VerifyModification(
329*795d594fSAndroid Build Coastguard Worker       kMethodFlagsTestDex,
330*795d594fSAndroid Build Coastguard Worker       "method_flags_missing_constructor_tag_ok",
331*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
332*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
333*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
334*795d594fSAndroid Build Coastguard Worker 
335*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "<init>", ~kAccConstructor);
336*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "<clinit>", ~kAccConstructor);
337*795d594fSAndroid Build Coastguard Worker       },
338*795d594fSAndroid Build Coastguard Worker       nullptr);
339*795d594fSAndroid Build Coastguard Worker 
340*795d594fSAndroid Build Coastguard Worker   constexpr const char* kConstructors[] = { "<clinit>", "<init>"};
341*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < 2; ++i) {
342*795d594fSAndroid Build Coastguard Worker     // Constructor with code marked native.
343*795d594fSAndroid Build Coastguard Worker     VerifyModification(
344*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
345*795d594fSAndroid Build Coastguard Worker         "method_flags_constructor_native",
346*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
347*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
348*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
349*795d594fSAndroid Build Coastguard Worker 
350*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kConstructors[i], kAccNative);
351*795d594fSAndroid Build Coastguard Worker         },
352*795d594fSAndroid Build Coastguard Worker         "has code, but is marked native or abstract");
353*795d594fSAndroid Build Coastguard Worker     // Constructor with code marked abstract.
354*795d594fSAndroid Build Coastguard Worker     VerifyModification(
355*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
356*795d594fSAndroid Build Coastguard Worker         "method_flags_constructor_abstract",
357*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
358*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
359*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
360*795d594fSAndroid Build Coastguard Worker 
361*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kConstructors[i], kAccAbstract);
362*795d594fSAndroid Build Coastguard Worker         },
363*795d594fSAndroid Build Coastguard Worker         "has code, but is marked native or abstract");
364*795d594fSAndroid Build Coastguard Worker     // Constructor as-is without code.
365*795d594fSAndroid Build Coastguard Worker     VerifyModification(
366*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
367*795d594fSAndroid Build Coastguard Worker         "method_flags_constructor_nocode",
368*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
369*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
370*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
371*795d594fSAndroid Build Coastguard Worker 
372*795d594fSAndroid Build Coastguard Worker           RemoveCode(dex_file, kConstructors[i]);
373*795d594fSAndroid Build Coastguard Worker         },
374*795d594fSAndroid Build Coastguard Worker         "has no code, but is not marked native or abstract");
375*795d594fSAndroid Build Coastguard Worker     // Constructor without code marked native.
376*795d594fSAndroid Build Coastguard Worker     VerifyModification(
377*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
378*795d594fSAndroid Build Coastguard Worker         "method_flags_constructor_native_nocode",
379*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
380*795d594fSAndroid Build Coastguard Worker           MakeDexVersion37(dex_file);
381*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
382*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
383*795d594fSAndroid Build Coastguard Worker 
384*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kConstructors[i], kAccNative);
385*795d594fSAndroid Build Coastguard Worker           RemoveCode(dex_file, kConstructors[i]);
386*795d594fSAndroid Build Coastguard Worker         },
387*795d594fSAndroid Build Coastguard Worker         "must not be abstract or native");
388*795d594fSAndroid Build Coastguard Worker     // Constructor without code marked abstract.
389*795d594fSAndroid Build Coastguard Worker     VerifyModification(
390*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
391*795d594fSAndroid Build Coastguard Worker         "method_flags_constructor_abstract_nocode",
392*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
393*795d594fSAndroid Build Coastguard Worker           MakeDexVersion37(dex_file);
394*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
395*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
396*795d594fSAndroid Build Coastguard Worker 
397*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kConstructors[i], kAccAbstract);
398*795d594fSAndroid Build Coastguard Worker           RemoveCode(dex_file, kConstructors[i]);
399*795d594fSAndroid Build Coastguard Worker         },
400*795d594fSAndroid Build Coastguard Worker         "must not be abstract or native");
401*795d594fSAndroid Build Coastguard Worker   }
402*795d594fSAndroid Build Coastguard Worker   // <init> may only have (modulo ignored):
403*795d594fSAndroid Build Coastguard Worker   // kAccPrivate | kAccProtected | kAccPublic | kAccStrict | kAccVarargs | kAccSynthetic
404*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t kInitAllowed[] = {
405*795d594fSAndroid Build Coastguard Worker       0,
406*795d594fSAndroid Build Coastguard Worker       kAccPrivate,
407*795d594fSAndroid Build Coastguard Worker       kAccProtected,
408*795d594fSAndroid Build Coastguard Worker       kAccPublic,
409*795d594fSAndroid Build Coastguard Worker       kAccStrict,
410*795d594fSAndroid Build Coastguard Worker       kAccVarargs,
411*795d594fSAndroid Build Coastguard Worker       kAccSynthetic
412*795d594fSAndroid Build Coastguard Worker   };
413*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kInitAllowed); ++i) {
414*795d594fSAndroid Build Coastguard Worker     VerifyModification(
415*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
416*795d594fSAndroid Build Coastguard Worker         "init_allowed_flags",
417*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
418*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
419*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
420*795d594fSAndroid Build Coastguard Worker 
421*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "<init>", ~kAccPublic);
422*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, "<init>", kInitAllowed[i]);
423*795d594fSAndroid Build Coastguard Worker         },
424*795d594fSAndroid Build Coastguard Worker         nullptr);
425*795d594fSAndroid Build Coastguard Worker   }
426*795d594fSAndroid Build Coastguard Worker   // Only one of public-private-protected.
427*795d594fSAndroid Build Coastguard Worker   for (size_t i = 1; i < 8; ++i) {
428*795d594fSAndroid Build Coastguard Worker     if (POPCOUNT(i) < 2) {
429*795d594fSAndroid Build Coastguard Worker       continue;
430*795d594fSAndroid Build Coastguard Worker     }
431*795d594fSAndroid Build Coastguard Worker     // Technically the flags match, but just be defensive here.
432*795d594fSAndroid Build Coastguard Worker     uint32_t mask = ((i & 1) != 0 ? kAccPrivate : 0) |
433*795d594fSAndroid Build Coastguard Worker                     ((i & 2) != 0 ? kAccProtected : 0) |
434*795d594fSAndroid Build Coastguard Worker                     ((i & 4) != 0 ? kAccPublic : 0);
435*795d594fSAndroid Build Coastguard Worker     VerifyModification(
436*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
437*795d594fSAndroid Build Coastguard Worker         "init_one_of_ppp",
438*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
439*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
440*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
441*795d594fSAndroid Build Coastguard Worker 
442*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "<init>", ~kAccPublic);
443*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, "<init>", mask);
444*795d594fSAndroid Build Coastguard Worker         },
445*795d594fSAndroid Build Coastguard Worker         "Method may have only one of public/protected/private");
446*795d594fSAndroid Build Coastguard Worker   }
447*795d594fSAndroid Build Coastguard Worker   // <init> doesn't allow
448*795d594fSAndroid Build Coastguard Worker   // kAccStatic | kAccFinal | kAccSynchronized | kAccBridge
449*795d594fSAndroid Build Coastguard Worker   // Need to handle static separately as it has its own error message.
450*795d594fSAndroid Build Coastguard Worker   VerifyModification(
451*795d594fSAndroid Build Coastguard Worker       kMethodFlagsTestDex,
452*795d594fSAndroid Build Coastguard Worker       "init_not_allowed_flags",
453*795d594fSAndroid Build Coastguard Worker       [&](DexFile* dex_file) {
454*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
455*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
456*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
457*795d594fSAndroid Build Coastguard Worker 
458*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "<init>", ~kAccPublic);
459*795d594fSAndroid Build Coastguard Worker         OrMaskToMethodFlags(dex_file, "<init>", kAccStatic);
460*795d594fSAndroid Build Coastguard Worker       },
461*795d594fSAndroid Build Coastguard Worker       "Constructor 1(LMethodFlags;.<init>) is not flagged correctly wrt/ static");
462*795d594fSAndroid Build Coastguard Worker   static constexpr uint32_t kInitNotAllowed[] = {
463*795d594fSAndroid Build Coastguard Worker       kAccFinal,
464*795d594fSAndroid Build Coastguard Worker       kAccSynchronized,
465*795d594fSAndroid Build Coastguard Worker       kAccBridge
466*795d594fSAndroid Build Coastguard Worker   };
467*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kInitNotAllowed); ++i) {
468*795d594fSAndroid Build Coastguard Worker     VerifyModification(
469*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
470*795d594fSAndroid Build Coastguard Worker         "init_not_allowed_flags",
471*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
472*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
473*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
474*795d594fSAndroid Build Coastguard Worker 
475*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "<init>", ~kAccPublic);
476*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, "<init>", kInitNotAllowed[i]);
477*795d594fSAndroid Build Coastguard Worker         },
478*795d594fSAndroid Build Coastguard Worker         "Constructor 1(LMethodFlags;.<init>) flagged inappropriately");
479*795d594fSAndroid Build Coastguard Worker   }
480*795d594fSAndroid Build Coastguard Worker }
481*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,MethodAccessFlagsMethods)482*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, MethodAccessFlagsMethods) {
483*795d594fSAndroid Build Coastguard Worker   constexpr const char* kMethods[] = { "foo", "bar"};
484*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kMethods); ++i) {
485*795d594fSAndroid Build Coastguard Worker     // Make sure we reject non-constructors marked as constructors.
486*795d594fSAndroid Build Coastguard Worker     VerifyModification(
487*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
488*795d594fSAndroid Build Coastguard Worker         "method_flags_non_constructor",
489*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
490*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
491*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
492*795d594fSAndroid Build Coastguard Worker 
493*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kMethods[i], kAccConstructor);
494*795d594fSAndroid Build Coastguard Worker         },
495*795d594fSAndroid Build Coastguard Worker         "is marked constructor, but doesn't match name");
496*795d594fSAndroid Build Coastguard Worker 
497*795d594fSAndroid Build Coastguard Worker     VerifyModification(
498*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
499*795d594fSAndroid Build Coastguard Worker         "method_flags_native_with_code",
500*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
501*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
502*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
503*795d594fSAndroid Build Coastguard Worker 
504*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kMethods[i], kAccNative);
505*795d594fSAndroid Build Coastguard Worker         },
506*795d594fSAndroid Build Coastguard Worker         "has code, but is marked native or abstract");
507*795d594fSAndroid Build Coastguard Worker 
508*795d594fSAndroid Build Coastguard Worker     VerifyModification(
509*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
510*795d594fSAndroid Build Coastguard Worker         "method_flags_abstract_with_code",
511*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
512*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
513*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
514*795d594fSAndroid Build Coastguard Worker 
515*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kMethods[i], kAccAbstract);
516*795d594fSAndroid Build Coastguard Worker         },
517*795d594fSAndroid Build Coastguard Worker         "has code, but is marked native or abstract");
518*795d594fSAndroid Build Coastguard Worker 
519*795d594fSAndroid Build Coastguard Worker     VerifyModification(
520*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
521*795d594fSAndroid Build Coastguard Worker         "method_flags_non_abstract_native_no_code",
522*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
523*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
524*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
525*795d594fSAndroid Build Coastguard Worker 
526*795d594fSAndroid Build Coastguard Worker           RemoveCode(dex_file, kMethods[i]);
527*795d594fSAndroid Build Coastguard Worker         },
528*795d594fSAndroid Build Coastguard Worker         "has no code, but is not marked native or abstract");
529*795d594fSAndroid Build Coastguard Worker 
530*795d594fSAndroid Build Coastguard Worker     // Abstract methods may not have the following flags.
531*795d594fSAndroid Build Coastguard Worker     constexpr uint32_t kAbstractDisallowed[] = {
532*795d594fSAndroid Build Coastguard Worker         kAccPrivate,
533*795d594fSAndroid Build Coastguard Worker         kAccStatic,
534*795d594fSAndroid Build Coastguard Worker         kAccFinal,
535*795d594fSAndroid Build Coastguard Worker         kAccNative,
536*795d594fSAndroid Build Coastguard Worker         kAccStrict,
537*795d594fSAndroid Build Coastguard Worker         kAccSynchronized,
538*795d594fSAndroid Build Coastguard Worker     };
539*795d594fSAndroid Build Coastguard Worker     for (size_t j = 0; j < arraysize(kAbstractDisallowed); ++j) {
540*795d594fSAndroid Build Coastguard Worker       VerifyModification(
541*795d594fSAndroid Build Coastguard Worker           kMethodFlagsTestDex,
542*795d594fSAndroid Build Coastguard Worker           "method_flags_abstract_and_disallowed_no_code",
543*795d594fSAndroid Build Coastguard Worker           [&](DexFile* dex_file) {
544*795d594fSAndroid Build Coastguard Worker             ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
545*795d594fSAndroid Build Coastguard Worker             ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
546*795d594fSAndroid Build Coastguard Worker 
547*795d594fSAndroid Build Coastguard Worker             RemoveCode(dex_file, kMethods[i]);
548*795d594fSAndroid Build Coastguard Worker 
549*795d594fSAndroid Build Coastguard Worker             // Can't check private and static with foo, as it's in the virtual list and gives a
550*795d594fSAndroid Build Coastguard Worker             // different error.
551*795d594fSAndroid Build Coastguard Worker             if (((GetMethodFlags(dex_file, kMethods[i]) & kAccPublic) != 0) &&
552*795d594fSAndroid Build Coastguard Worker                 ((kAbstractDisallowed[j] & (kAccPrivate | kAccStatic)) != 0)) {
553*795d594fSAndroid Build Coastguard Worker               // Use another breaking flag.
554*795d594fSAndroid Build Coastguard Worker               OrMaskToMethodFlags(dex_file, kMethods[i], kAccAbstract | kAccFinal);
555*795d594fSAndroid Build Coastguard Worker             } else {
556*795d594fSAndroid Build Coastguard Worker               OrMaskToMethodFlags(dex_file, kMethods[i], kAccAbstract | kAbstractDisallowed[j]);
557*795d594fSAndroid Build Coastguard Worker             }
558*795d594fSAndroid Build Coastguard Worker           },
559*795d594fSAndroid Build Coastguard Worker           "has disallowed access flags");
560*795d594fSAndroid Build Coastguard Worker     }
561*795d594fSAndroid Build Coastguard Worker 
562*795d594fSAndroid Build Coastguard Worker     // Only one of public-private-protected.
563*795d594fSAndroid Build Coastguard Worker     for (size_t j = 1; j < 8; ++j) {
564*795d594fSAndroid Build Coastguard Worker       if (POPCOUNT(j) < 2) {
565*795d594fSAndroid Build Coastguard Worker         continue;
566*795d594fSAndroid Build Coastguard Worker       }
567*795d594fSAndroid Build Coastguard Worker       // Technically the flags match, but just be defensive here.
568*795d594fSAndroid Build Coastguard Worker       uint32_t mask = ((j & 1) != 0 ? kAccPrivate : 0) |
569*795d594fSAndroid Build Coastguard Worker                       ((j & 2) != 0 ? kAccProtected : 0) |
570*795d594fSAndroid Build Coastguard Worker                       ((j & 4) != 0 ? kAccPublic : 0);
571*795d594fSAndroid Build Coastguard Worker       VerifyModification(
572*795d594fSAndroid Build Coastguard Worker           kMethodFlagsTestDex,
573*795d594fSAndroid Build Coastguard Worker           "method_flags_one_of_ppp",
574*795d594fSAndroid Build Coastguard Worker           [&](DexFile* dex_file) {
575*795d594fSAndroid Build Coastguard Worker             ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
576*795d594fSAndroid Build Coastguard Worker             ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
577*795d594fSAndroid Build Coastguard Worker 
578*795d594fSAndroid Build Coastguard Worker             ApplyMaskToMethodFlags(dex_file, kMethods[i], ~kAccPublic);
579*795d594fSAndroid Build Coastguard Worker             OrMaskToMethodFlags(dex_file, kMethods[i], mask);
580*795d594fSAndroid Build Coastguard Worker           },
581*795d594fSAndroid Build Coastguard Worker           "Method may have only one of public/protected/private");
582*795d594fSAndroid Build Coastguard Worker     }
583*795d594fSAndroid Build Coastguard Worker   }
584*795d594fSAndroid Build Coastguard Worker }
585*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,MethodAccessFlagsIgnoredOK)586*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, MethodAccessFlagsIgnoredOK) {
587*795d594fSAndroid Build Coastguard Worker   constexpr const char* kMethods[] = { "<clinit>", "<init>", "foo", "bar"};
588*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kMethods); ++i) {
589*795d594fSAndroid Build Coastguard Worker     // All interesting method flags, other flags are to be ignored.
590*795d594fSAndroid Build Coastguard Worker     constexpr uint32_t kAllMethodFlags =
591*795d594fSAndroid Build Coastguard Worker         kAccPublic |
592*795d594fSAndroid Build Coastguard Worker         kAccPrivate |
593*795d594fSAndroid Build Coastguard Worker         kAccProtected |
594*795d594fSAndroid Build Coastguard Worker         kAccStatic |
595*795d594fSAndroid Build Coastguard Worker         kAccFinal |
596*795d594fSAndroid Build Coastguard Worker         kAccSynchronized |
597*795d594fSAndroid Build Coastguard Worker         kAccBridge |
598*795d594fSAndroid Build Coastguard Worker         kAccVarargs |
599*795d594fSAndroid Build Coastguard Worker         kAccNative |
600*795d594fSAndroid Build Coastguard Worker         kAccAbstract |
601*795d594fSAndroid Build Coastguard Worker         kAccStrict |
602*795d594fSAndroid Build Coastguard Worker         kAccSynthetic;
603*795d594fSAndroid Build Coastguard Worker     constexpr uint32_t kIgnoredMask = ~kAllMethodFlags & 0xFFFF;
604*795d594fSAndroid Build Coastguard Worker     VerifyModification(
605*795d594fSAndroid Build Coastguard Worker         kMethodFlagsTestDex,
606*795d594fSAndroid Build Coastguard Worker         "method_flags_ignored",
607*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
608*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
609*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
610*795d594fSAndroid Build Coastguard Worker 
611*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, kMethods[i], kIgnoredMask);
612*795d594fSAndroid Build Coastguard Worker         },
613*795d594fSAndroid Build Coastguard Worker         nullptr);
614*795d594fSAndroid Build Coastguard Worker   }
615*795d594fSAndroid Build Coastguard Worker }
616*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,B28552165)617*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, B28552165) {
618*795d594fSAndroid Build Coastguard Worker   // Regression test for bad error string retrieval in different situations.
619*795d594fSAndroid Build Coastguard Worker   // Using invalid access flags to trigger the error.
620*795d594fSAndroid Build Coastguard Worker   VerifyModification(
621*795d594fSAndroid Build Coastguard Worker       kMethodFlagsTestDex,
622*795d594fSAndroid Build Coastguard Worker       "b28552165",
623*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
624*795d594fSAndroid Build Coastguard Worker         OrMaskToMethodFlags(dex_file, "foo", kAccPublic | kAccProtected);
625*795d594fSAndroid Build Coastguard Worker       },
626*795d594fSAndroid Build Coastguard Worker       "Method may have only one of public/protected/private, LMethodFlags;.foo");
627*795d594fSAndroid Build Coastguard Worker }
628*795d594fSAndroid Build Coastguard Worker 
629*795d594fSAndroid Build Coastguard Worker // Set of dex files for interface method tests. As it's not as easy to mutate method names, it's
630*795d594fSAndroid Build Coastguard Worker // just easier to break up bad cases.
631*795d594fSAndroid Build Coastguard Worker 
632*795d594fSAndroid Build Coastguard Worker // Standard interface. Use declared-synchronized again for 3B encoding.
633*795d594fSAndroid Build Coastguard Worker //
634*795d594fSAndroid Build Coastguard Worker // .class public interface LInterfaceMethodFlags;
635*795d594fSAndroid Build Coastguard Worker // .super Ljava/lang/Object;
636*795d594fSAndroid Build Coastguard Worker //
637*795d594fSAndroid Build Coastguard Worker // .method public static constructor <clinit>()V
638*795d594fSAndroid Build Coastguard Worker // .registers 1
639*795d594fSAndroid Build Coastguard Worker //     return-void
640*795d594fSAndroid Build Coastguard Worker // .end method
641*795d594fSAndroid Build Coastguard Worker //
642*795d594fSAndroid Build Coastguard Worker // .method public abstract declared-synchronized foo()V
643*795d594fSAndroid Build Coastguard Worker // .end method
644*795d594fSAndroid Build Coastguard Worker static const char kMethodFlagsInterface[] =
645*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQCOM0odZ5bws1d9GSmumXaK5iE/7XxFpOm8AQAAcAAAAHhWNBIAAAAAAAAAADQBAAAF"
646*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAMAAACEAAAAAQAAAJAAAAAAAAAAAAAAAAIAAACcAAAAAQAAAKwAAADwAAAAzAAAAMwA"
647*795d594fSAndroid Build Coastguard Worker     "AADWAAAA7gAAAAIBAAAFAQAAAQAAAAIAAAADAAAAAwAAAAIAAAAAAAAAAAAAAAAAAAAAAAAABAAA"
648*795d594fSAndroid Build Coastguard Worker     "AAAAAAABAgAAAQAAAAAAAAD/////AAAAACIBAAAAAAAACDxjbGluaXQ+ABZMSW50ZXJmYWNlTWV0"
649*795d594fSAndroid Build Coastguard Worker     "aG9kRmxhZ3M7ABJMamF2YS9sYW5nL09iamVjdDsAAVYAA2ZvbwAAAAAAAAABAAAAAAAAAAAAAAAB"
650*795d594fSAndroid Build Coastguard Worker     "AAAADgAAAAEBAImABJACAYGICAAAAAALAAAAAAAAAAEAAAAAAAAAAQAAAAUAAABwAAAAAgAAAAMA"
651*795d594fSAndroid Build Coastguard Worker     "AACEAAAAAwAAAAEAAACQAAAABQAAAAIAAACcAAAABgAAAAEAAACsAAAAAiAAAAUAAADMAAAAAxAA"
652*795d594fSAndroid Build Coastguard Worker     "AAEAAAAMAQAAASAAAAEAAAAQAQAAACAAAAEAAAAiAQAAABAAAAEAAAA0AQAA";
653*795d594fSAndroid Build Coastguard Worker 
654*795d594fSAndroid Build Coastguard Worker // To simplify generation of interesting "sub-states" of src_value, allow a "simple" mask to apply
655*795d594fSAndroid Build Coastguard Worker // to a src_value, such that mask bit 0 applies to the lowest set bit in src_value, and so on.
ApplyMaskShifted(uint32_t src_value,uint32_t mask)656*795d594fSAndroid Build Coastguard Worker static uint32_t ApplyMaskShifted(uint32_t src_value, uint32_t mask) {
657*795d594fSAndroid Build Coastguard Worker   uint32_t result = 0;
658*795d594fSAndroid Build Coastguard Worker   uint32_t mask_index = 0;
659*795d594fSAndroid Build Coastguard Worker   while (src_value != 0) {
660*795d594fSAndroid Build Coastguard Worker     uint32_t index = CTZ(src_value);
661*795d594fSAndroid Build Coastguard Worker     if (((src_value & (1 << index)) != 0) &&
662*795d594fSAndroid Build Coastguard Worker         ((mask & (1 << mask_index)) != 0)) {
663*795d594fSAndroid Build Coastguard Worker       result |= (1 << index);
664*795d594fSAndroid Build Coastguard Worker     }
665*795d594fSAndroid Build Coastguard Worker     src_value &= ~(1 << index);
666*795d594fSAndroid Build Coastguard Worker     mask_index++;
667*795d594fSAndroid Build Coastguard Worker   }
668*795d594fSAndroid Build Coastguard Worker   return result;
669*795d594fSAndroid Build Coastguard Worker }
670*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,MethodAccessFlagsInterfaces)671*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, MethodAccessFlagsInterfaces) {
672*795d594fSAndroid Build Coastguard Worker   VerifyModification(
673*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
674*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_ok",
675*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
676*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
677*795d594fSAndroid Build Coastguard Worker       },
678*795d594fSAndroid Build Coastguard Worker       nullptr);
679*795d594fSAndroid Build Coastguard Worker   VerifyModification(
680*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
681*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_ok37",
682*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
683*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
684*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
685*795d594fSAndroid Build Coastguard Worker       },
686*795d594fSAndroid Build Coastguard Worker       nullptr);
687*795d594fSAndroid Build Coastguard Worker 
688*795d594fSAndroid Build Coastguard Worker   VerifyModification(
689*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
690*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_non_public",
691*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
692*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
693*795d594fSAndroid Build Coastguard Worker 
694*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
695*795d594fSAndroid Build Coastguard Worker       },
696*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
697*795d594fSAndroid Build Coastguard Worker   VerifyModification(
698*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
699*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_non_public",
700*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
701*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
702*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
703*795d594fSAndroid Build Coastguard Worker 
704*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
705*795d594fSAndroid Build Coastguard Worker       },
706*795d594fSAndroid Build Coastguard Worker       "Interface virtual method 1(LInterfaceMethodFlags;.foo) is not public");
707*795d594fSAndroid Build Coastguard Worker 
708*795d594fSAndroid Build Coastguard Worker   VerifyModification(
709*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
710*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_non_abstract",
711*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
712*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
713*795d594fSAndroid Build Coastguard Worker 
714*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccAbstract);
715*795d594fSAndroid Build Coastguard Worker       },
716*795d594fSAndroid Build Coastguard Worker       "Method 1(LInterfaceMethodFlags;.foo) has no code, but is not marked native or abstract");
717*795d594fSAndroid Build Coastguard Worker 
718*795d594fSAndroid Build Coastguard Worker   VerifyModification(
719*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
720*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_static",
721*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
722*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
723*795d594fSAndroid Build Coastguard Worker 
724*795d594fSAndroid Build Coastguard Worker         OrMaskToMethodFlags(dex_file, "foo", kAccStatic);
725*795d594fSAndroid Build Coastguard Worker       },
726*795d594fSAndroid Build Coastguard Worker       "Direct/virtual method 1(LInterfaceMethodFlags;.foo) not in expected list 0");
727*795d594fSAndroid Build Coastguard Worker   VerifyModification(
728*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
729*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_private",
730*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
731*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
732*795d594fSAndroid Build Coastguard Worker 
733*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
734*795d594fSAndroid Build Coastguard Worker         OrMaskToMethodFlags(dex_file, "foo", kAccPrivate);
735*795d594fSAndroid Build Coastguard Worker       },
736*795d594fSAndroid Build Coastguard Worker       "Direct/virtual method 1(LInterfaceMethodFlags;.foo) not in expected list 0");
737*795d594fSAndroid Build Coastguard Worker 
738*795d594fSAndroid Build Coastguard Worker   VerifyModification(
739*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
740*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_non_public",
741*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
742*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
743*795d594fSAndroid Build Coastguard Worker 
744*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
745*795d594fSAndroid Build Coastguard Worker       },
746*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
747*795d594fSAndroid Build Coastguard Worker   VerifyModification(
748*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
749*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_non_public",
750*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
751*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
752*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
753*795d594fSAndroid Build Coastguard Worker 
754*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
755*795d594fSAndroid Build Coastguard Worker       },
756*795d594fSAndroid Build Coastguard Worker       "Interface virtual method 1(LInterfaceMethodFlags;.foo) is not public");
757*795d594fSAndroid Build Coastguard Worker 
758*795d594fSAndroid Build Coastguard Worker   VerifyModification(
759*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
760*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_protected",
761*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
762*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
763*795d594fSAndroid Build Coastguard Worker 
764*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
765*795d594fSAndroid Build Coastguard Worker         OrMaskToMethodFlags(dex_file, "foo", kAccProtected);
766*795d594fSAndroid Build Coastguard Worker       },
767*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
768*795d594fSAndroid Build Coastguard Worker   VerifyModification(
769*795d594fSAndroid Build Coastguard Worker       kMethodFlagsInterface,
770*795d594fSAndroid Build Coastguard Worker       "method_flags_interface_protected",
771*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
772*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
773*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
774*795d594fSAndroid Build Coastguard Worker 
775*795d594fSAndroid Build Coastguard Worker         ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
776*795d594fSAndroid Build Coastguard Worker         OrMaskToMethodFlags(dex_file, "foo", kAccProtected);
777*795d594fSAndroid Build Coastguard Worker       },
778*795d594fSAndroid Build Coastguard Worker       "Interface virtual method 1(LInterfaceMethodFlags;.foo) is not public");
779*795d594fSAndroid Build Coastguard Worker 
780*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kAllMethodFlags =
781*795d594fSAndroid Build Coastguard Worker       kAccPublic |
782*795d594fSAndroid Build Coastguard Worker       kAccPrivate |
783*795d594fSAndroid Build Coastguard Worker       kAccProtected |
784*795d594fSAndroid Build Coastguard Worker       kAccStatic |
785*795d594fSAndroid Build Coastguard Worker       kAccFinal |
786*795d594fSAndroid Build Coastguard Worker       kAccSynchronized |
787*795d594fSAndroid Build Coastguard Worker       kAccBridge |
788*795d594fSAndroid Build Coastguard Worker       kAccVarargs |
789*795d594fSAndroid Build Coastguard Worker       kAccNative |
790*795d594fSAndroid Build Coastguard Worker       kAccAbstract |
791*795d594fSAndroid Build Coastguard Worker       kAccStrict |
792*795d594fSAndroid Build Coastguard Worker       kAccSynthetic;
793*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kInterfaceMethodFlags =
794*795d594fSAndroid Build Coastguard Worker       kAccPublic | kAccAbstract | kAccVarargs | kAccBridge | kAccSynthetic;
795*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kInterfaceDisallowed = kAllMethodFlags &
796*795d594fSAndroid Build Coastguard Worker                                             ~kInterfaceMethodFlags &
797*795d594fSAndroid Build Coastguard Worker                                             // Already tested, needed to be separate.
798*795d594fSAndroid Build Coastguard Worker                                             ~kAccStatic &
799*795d594fSAndroid Build Coastguard Worker                                             ~kAccPrivate &
800*795d594fSAndroid Build Coastguard Worker                                             ~kAccProtected;
801*795d594fSAndroid Build Coastguard Worker   static_assert(kInterfaceDisallowed != 0, "There should be disallowed flags.");
802*795d594fSAndroid Build Coastguard Worker 
803*795d594fSAndroid Build Coastguard Worker   uint32_t bits = POPCOUNT(kInterfaceDisallowed);
804*795d594fSAndroid Build Coastguard Worker   for (uint32_t i = 1; i < (1u << bits); ++i) {
805*795d594fSAndroid Build Coastguard Worker     VerifyModification(
806*795d594fSAndroid Build Coastguard Worker         kMethodFlagsInterface,
807*795d594fSAndroid Build Coastguard Worker         "method_flags_interface_non_abstract",
808*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
809*795d594fSAndroid Build Coastguard Worker           ApplyMaskToMethodFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
810*795d594fSAndroid Build Coastguard Worker 
811*795d594fSAndroid Build Coastguard Worker           uint32_t mask = ApplyMaskShifted(kInterfaceDisallowed, i);
812*795d594fSAndroid Build Coastguard Worker           if ((mask & kAccProtected) != 0) {
813*795d594fSAndroid Build Coastguard Worker             mask &= ~kAccProtected;
814*795d594fSAndroid Build Coastguard Worker             ApplyMaskToMethodFlags(dex_file, "foo", ~kAccPublic);
815*795d594fSAndroid Build Coastguard Worker           }
816*795d594fSAndroid Build Coastguard Worker           OrMaskToMethodFlags(dex_file, "foo", mask);
817*795d594fSAndroid Build Coastguard Worker         },
818*795d594fSAndroid Build Coastguard Worker         "Abstract method 1(LInterfaceMethodFlags;.foo) has disallowed access flags");
819*795d594fSAndroid Build Coastguard Worker   }
820*795d594fSAndroid Build Coastguard Worker }
821*795d594fSAndroid Build Coastguard Worker 
822*795d594fSAndroid Build Coastguard Worker ///////////////////////////////////////////////////////////////////
823*795d594fSAndroid Build Coastguard Worker 
824*795d594fSAndroid Build Coastguard Worker // Field flags.
825*795d594fSAndroid Build Coastguard Worker 
826*795d594fSAndroid Build Coastguard Worker // Find the method data for the first method with the given name (from class 0). Note: the pointer
827*795d594fSAndroid Build Coastguard Worker // is to the access flags, so that the caller doesn't have to handle the leb128-encoded method-index
828*795d594fSAndroid Build Coastguard Worker // delta.
FindFieldData(const DexFile * dex_file,const char * name)829*795d594fSAndroid Build Coastguard Worker static const uint8_t* FindFieldData(const DexFile* dex_file, const char* name) {
830*795d594fSAndroid Build Coastguard Worker   ClassAccessor accessor(*dex_file, dex_file->GetClassDef(0));
831*795d594fSAndroid Build Coastguard Worker 
832*795d594fSAndroid Build Coastguard Worker   for (const ClassAccessor::Field& field : accessor.GetFields()) {
833*795d594fSAndroid Build Coastguard Worker     uint32_t field_index = field.GetIndex();
834*795d594fSAndroid Build Coastguard Worker     dex::StringIndex name_index = dex_file->GetFieldId(field_index).name_idx_;
835*795d594fSAndroid Build Coastguard Worker     const dex::StringId& string_id = dex_file->GetStringId(name_index);
836*795d594fSAndroid Build Coastguard Worker     const char* str = dex_file->GetStringData(string_id);
837*795d594fSAndroid Build Coastguard Worker     if (strcmp(name, str) == 0) {
838*795d594fSAndroid Build Coastguard Worker       // Go to the back of the access flags.
839*795d594fSAndroid Build Coastguard Worker       return ReverseSearchUnsignedLeb128(field.GetDataPointer());
840*795d594fSAndroid Build Coastguard Worker     }
841*795d594fSAndroid Build Coastguard Worker   }
842*795d594fSAndroid Build Coastguard Worker 
843*795d594fSAndroid Build Coastguard Worker   return nullptr;
844*795d594fSAndroid Build Coastguard Worker }
845*795d594fSAndroid Build Coastguard Worker 
846*795d594fSAndroid Build Coastguard Worker // Set the method flags to the given value.
SetFieldFlags(DexFile * dex_file,const char * field,uint32_t mask)847*795d594fSAndroid Build Coastguard Worker static void SetFieldFlags(DexFile* dex_file, const char* field, uint32_t mask) {
848*795d594fSAndroid Build Coastguard Worker   uint8_t* field_flags_ptr = const_cast<uint8_t*>(FindFieldData(dex_file, field));
849*795d594fSAndroid Build Coastguard Worker   CHECK(field_flags_ptr != nullptr) << field;
850*795d594fSAndroid Build Coastguard Worker 
851*795d594fSAndroid Build Coastguard Worker     // Unroll this, as we only have three bytes, anyways.
852*795d594fSAndroid Build Coastguard Worker   uint8_t base1 = static_cast<uint8_t>(mask & 0x7F);
853*795d594fSAndroid Build Coastguard Worker   *(field_flags_ptr++) = (base1 | 0x80);
854*795d594fSAndroid Build Coastguard Worker   mask >>= 7;
855*795d594fSAndroid Build Coastguard Worker 
856*795d594fSAndroid Build Coastguard Worker   uint8_t base2 = static_cast<uint8_t>(mask & 0x7F);
857*795d594fSAndroid Build Coastguard Worker   *(field_flags_ptr++) = (base2 | 0x80);
858*795d594fSAndroid Build Coastguard Worker   mask >>= 7;
859*795d594fSAndroid Build Coastguard Worker 
860*795d594fSAndroid Build Coastguard Worker   uint8_t base3 = static_cast<uint8_t>(mask & 0x7F);
861*795d594fSAndroid Build Coastguard Worker   *field_flags_ptr = base3;
862*795d594fSAndroid Build Coastguard Worker }
863*795d594fSAndroid Build Coastguard Worker 
GetFieldFlags(DexFile * dex_file,const char * field)864*795d594fSAndroid Build Coastguard Worker static uint32_t GetFieldFlags(DexFile* dex_file, const char* field) {
865*795d594fSAndroid Build Coastguard Worker   const uint8_t* field_flags_ptr = const_cast<uint8_t*>(FindFieldData(dex_file, field));
866*795d594fSAndroid Build Coastguard Worker   CHECK(field_flags_ptr != nullptr) << field;
867*795d594fSAndroid Build Coastguard Worker   return DecodeUnsignedLeb128(&field_flags_ptr);
868*795d594fSAndroid Build Coastguard Worker }
869*795d594fSAndroid Build Coastguard Worker 
870*795d594fSAndroid Build Coastguard Worker // Apply the given mask to method flags.
ApplyMaskToFieldFlags(DexFile * dex_file,const char * field,uint32_t mask)871*795d594fSAndroid Build Coastguard Worker static void ApplyMaskToFieldFlags(DexFile* dex_file, const char* field, uint32_t mask) {
872*795d594fSAndroid Build Coastguard Worker   uint32_t value = GetFieldFlags(dex_file, field);
873*795d594fSAndroid Build Coastguard Worker   value &= mask;
874*795d594fSAndroid Build Coastguard Worker   SetFieldFlags(dex_file, field, value);
875*795d594fSAndroid Build Coastguard Worker }
876*795d594fSAndroid Build Coastguard Worker 
877*795d594fSAndroid Build Coastguard Worker // Apply the given mask to method flags.
OrMaskToFieldFlags(DexFile * dex_file,const char * field,uint32_t mask)878*795d594fSAndroid Build Coastguard Worker static void OrMaskToFieldFlags(DexFile* dex_file, const char* field, uint32_t mask) {
879*795d594fSAndroid Build Coastguard Worker   uint32_t value = GetFieldFlags(dex_file, field);
880*795d594fSAndroid Build Coastguard Worker   value |= mask;
881*795d594fSAndroid Build Coastguard Worker   SetFieldFlags(dex_file, field, value);
882*795d594fSAndroid Build Coastguard Worker }
883*795d594fSAndroid Build Coastguard Worker 
884*795d594fSAndroid Build Coastguard Worker // Standard class. Use declared-synchronized again for 3B encoding.
885*795d594fSAndroid Build Coastguard Worker //
886*795d594fSAndroid Build Coastguard Worker // .class public LFieldFlags;
887*795d594fSAndroid Build Coastguard Worker // .super Ljava/lang/Object;
888*795d594fSAndroid Build Coastguard Worker //
889*795d594fSAndroid Build Coastguard Worker // .field declared-synchronized public foo:I
890*795d594fSAndroid Build Coastguard Worker //
891*795d594fSAndroid Build Coastguard Worker // .field declared-synchronized public static bar:I
892*795d594fSAndroid Build Coastguard Worker 
893*795d594fSAndroid Build Coastguard Worker static const char kFieldFlagsTestDex[] =
894*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQBtLw7hydbfv4TdXidZyzAB70W7w3vnYJRwAQAAcAAAAHhWNBIAAAAAAAAAAAABAAAF"
895*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAMAAACEAAAAAAAAAAAAAAACAAAAkAAAAAAAAAAAAAAAAQAAAKAAAACwAAAAwAAAAMAA"
896*795d594fSAndroid Build Coastguard Worker     "AADDAAAA0QAAAOUAAADqAAAAAAAAAAEAAAACAAAAAQAAAAMAAAABAAAABAAAAAEAAAABAAAAAgAA"
897*795d594fSAndroid Build Coastguard Worker     "AAAAAAD/////AAAAAPQAAAAAAAAAAUkADExGaWVsZEZsYWdzOwASTGphdmEvbGFuZy9PYmplY3Q7"
898*795d594fSAndroid Build Coastguard Worker     "AANiYXIAA2ZvbwAAAAAAAAEBAAAAiYAIAYGACAkAAAAAAAAAAQAAAAAAAAABAAAABQAAAHAAAAAC"
899*795d594fSAndroid Build Coastguard Worker     "AAAAAwAAAIQAAAAEAAAAAgAAAJAAAAAGAAAAAQAAAKAAAAACIAAABQAAAMAAAAADEAAAAQAAAPAA"
900*795d594fSAndroid Build Coastguard Worker     "AAAAIAAAAQAAAPQAAAAAEAAAAQAAAAABAAA=";
901*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,FieldAccessFlagsBase)902*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, FieldAccessFlagsBase) {
903*795d594fSAndroid Build Coastguard Worker   // Check that it's OK when the wrong declared-synchronized flag is removed from "foo."
904*795d594fSAndroid Build Coastguard Worker   VerifyModification(
905*795d594fSAndroid Build Coastguard Worker       kFieldFlagsTestDex,
906*795d594fSAndroid Build Coastguard Worker       "field_flags_ok",
907*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
908*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
909*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
910*795d594fSAndroid Build Coastguard Worker       },
911*795d594fSAndroid Build Coastguard Worker       nullptr);
912*795d594fSAndroid Build Coastguard Worker }
913*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,FieldAccessFlagsWrongList)914*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, FieldAccessFlagsWrongList) {
915*795d594fSAndroid Build Coastguard Worker   // Mark the field so that it should appear in the opposite list (instance vs static).
916*795d594fSAndroid Build Coastguard Worker   VerifyModification(
917*795d594fSAndroid Build Coastguard Worker       kFieldFlagsTestDex,
918*795d594fSAndroid Build Coastguard Worker       "field_flags_wrong_list",
919*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
920*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
921*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
922*795d594fSAndroid Build Coastguard Worker 
923*795d594fSAndroid Build Coastguard Worker         OrMaskToFieldFlags(dex_file, "foo", kAccStatic);
924*795d594fSAndroid Build Coastguard Worker       },
925*795d594fSAndroid Build Coastguard Worker       "Static/instance field not in expected list");
926*795d594fSAndroid Build Coastguard Worker   VerifyModification(
927*795d594fSAndroid Build Coastguard Worker       kFieldFlagsTestDex,
928*795d594fSAndroid Build Coastguard Worker       "field_flags_wrong_list",
929*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
930*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
931*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
932*795d594fSAndroid Build Coastguard Worker 
933*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "bar", ~kAccStatic);
934*795d594fSAndroid Build Coastguard Worker       },
935*795d594fSAndroid Build Coastguard Worker       "Static/instance field not in expected list");
936*795d594fSAndroid Build Coastguard Worker }
937*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,FieldAccessFlagsPPP)938*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, FieldAccessFlagsPPP) {
939*795d594fSAndroid Build Coastguard Worker   static const char* kFields[] = { "foo", "bar" };
940*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kFields); ++i) {
941*795d594fSAndroid Build Coastguard Worker     // Should be OK to remove public.
942*795d594fSAndroid Build Coastguard Worker     VerifyModification(
943*795d594fSAndroid Build Coastguard Worker         kFieldFlagsTestDex,
944*795d594fSAndroid Build Coastguard Worker         "field_flags_non_public",
945*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
946*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
947*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
948*795d594fSAndroid Build Coastguard Worker 
949*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, kFields[i], ~kAccPublic);
950*795d594fSAndroid Build Coastguard Worker         },
951*795d594fSAndroid Build Coastguard Worker         nullptr);
952*795d594fSAndroid Build Coastguard Worker     constexpr uint32_t kAccFlags = kAccPublic | kAccPrivate | kAccProtected;
953*795d594fSAndroid Build Coastguard Worker     uint32_t bits = POPCOUNT(kAccFlags);
954*795d594fSAndroid Build Coastguard Worker     for (uint32_t j = 1; j < (1u << bits); ++j) {
955*795d594fSAndroid Build Coastguard Worker       if (POPCOUNT(j) < 2) {
956*795d594fSAndroid Build Coastguard Worker         continue;
957*795d594fSAndroid Build Coastguard Worker       }
958*795d594fSAndroid Build Coastguard Worker       VerifyModification(
959*795d594fSAndroid Build Coastguard Worker            kFieldFlagsTestDex,
960*795d594fSAndroid Build Coastguard Worker            "field_flags_ppp",
961*795d594fSAndroid Build Coastguard Worker            [&](DexFile* dex_file) {
962*795d594fSAndroid Build Coastguard Worker              ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
963*795d594fSAndroid Build Coastguard Worker              ApplyMaskToFieldFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
964*795d594fSAndroid Build Coastguard Worker 
965*795d594fSAndroid Build Coastguard Worker              ApplyMaskToFieldFlags(dex_file, kFields[i], ~kAccPublic);
966*795d594fSAndroid Build Coastguard Worker              uint32_t mask = ApplyMaskShifted(kAccFlags, j);
967*795d594fSAndroid Build Coastguard Worker              OrMaskToFieldFlags(dex_file, kFields[i], mask);
968*795d594fSAndroid Build Coastguard Worker            },
969*795d594fSAndroid Build Coastguard Worker            "Field may have only one of public/protected/private");
970*795d594fSAndroid Build Coastguard Worker     }
971*795d594fSAndroid Build Coastguard Worker   }
972*795d594fSAndroid Build Coastguard Worker }
973*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,FieldAccessFlagsIgnoredOK)974*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, FieldAccessFlagsIgnoredOK) {
975*795d594fSAndroid Build Coastguard Worker   constexpr const char* kFields[] = { "foo", "bar"};
976*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kFields); ++i) {
977*795d594fSAndroid Build Coastguard Worker     // All interesting method flags, other flags are to be ignored.
978*795d594fSAndroid Build Coastguard Worker     constexpr uint32_t kAllFieldFlags =
979*795d594fSAndroid Build Coastguard Worker         kAccPublic |
980*795d594fSAndroid Build Coastguard Worker         kAccPrivate |
981*795d594fSAndroid Build Coastguard Worker         kAccProtected |
982*795d594fSAndroid Build Coastguard Worker         kAccStatic |
983*795d594fSAndroid Build Coastguard Worker         kAccFinal |
984*795d594fSAndroid Build Coastguard Worker         kAccVolatile |
985*795d594fSAndroid Build Coastguard Worker         kAccTransient |
986*795d594fSAndroid Build Coastguard Worker         kAccSynthetic |
987*795d594fSAndroid Build Coastguard Worker         kAccEnum;
988*795d594fSAndroid Build Coastguard Worker     constexpr uint32_t kIgnoredMask = ~kAllFieldFlags & 0xFFFF;
989*795d594fSAndroid Build Coastguard Worker     VerifyModification(
990*795d594fSAndroid Build Coastguard Worker         kFieldFlagsTestDex,
991*795d594fSAndroid Build Coastguard Worker         "field_flags_ignored",
992*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
993*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
994*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
995*795d594fSAndroid Build Coastguard Worker 
996*795d594fSAndroid Build Coastguard Worker           OrMaskToFieldFlags(dex_file, kFields[i], kIgnoredMask);
997*795d594fSAndroid Build Coastguard Worker         },
998*795d594fSAndroid Build Coastguard Worker         nullptr);
999*795d594fSAndroid Build Coastguard Worker   }
1000*795d594fSAndroid Build Coastguard Worker }
1001*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,FieldAccessFlagsVolatileFinal)1002*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, FieldAccessFlagsVolatileFinal) {
1003*795d594fSAndroid Build Coastguard Worker   constexpr const char* kFields[] = { "foo", "bar"};
1004*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kFields); ++i) {
1005*795d594fSAndroid Build Coastguard Worker     VerifyModification(
1006*795d594fSAndroid Build Coastguard Worker         kFieldFlagsTestDex,
1007*795d594fSAndroid Build Coastguard Worker         "field_flags_final_and_volatile",
1008*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
1009*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1010*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "bar", ~kAccDeclaredSynchronized);
1011*795d594fSAndroid Build Coastguard Worker 
1012*795d594fSAndroid Build Coastguard Worker           OrMaskToFieldFlags(dex_file, kFields[i], kAccVolatile | kAccFinal);
1013*795d594fSAndroid Build Coastguard Worker         },
1014*795d594fSAndroid Build Coastguard Worker         "Fields may not be volatile and final");
1015*795d594fSAndroid Build Coastguard Worker   }
1016*795d594fSAndroid Build Coastguard Worker }
1017*795d594fSAndroid Build Coastguard Worker 
1018*795d594fSAndroid Build Coastguard Worker // Standard interface. Needs to be separate from class as interfaces do not allow instance fields.
1019*795d594fSAndroid Build Coastguard Worker // Use declared-synchronized again for 3B encoding.
1020*795d594fSAndroid Build Coastguard Worker //
1021*795d594fSAndroid Build Coastguard Worker // .class public interface LInterfaceFieldFlags;
1022*795d594fSAndroid Build Coastguard Worker // .super Ljava/lang/Object;
1023*795d594fSAndroid Build Coastguard Worker //
1024*795d594fSAndroid Build Coastguard Worker // .field declared-synchronized public static final foo:I
1025*795d594fSAndroid Build Coastguard Worker 
1026*795d594fSAndroid Build Coastguard Worker static const char kFieldFlagsInterfaceTestDex[] =
1027*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQCVMHfEimR1zZPk6hl6O9GPAYqkl3u0umFkAQAAcAAAAHhWNBIAAAAAAAAAAPQAAAAE"
1028*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAMAAACAAAAAAAAAAAAAAAABAAAAjAAAAAAAAAAAAAAAAQAAAJQAAACwAAAAtAAAALQA"
1029*795d594fSAndroid Build Coastguard Worker     "AAC3AAAAzgAAAOIAAAAAAAAAAQAAAAIAAAABAAAAAwAAAAEAAAABAgAAAgAAAAAAAAD/////AAAA"
1030*795d594fSAndroid Build Coastguard Worker     "AOwAAAAAAAAAAUkAFUxJbnRlcmZhY2VGaWVsZEZsYWdzOwASTGphdmEvbGFuZy9PYmplY3Q7AANm"
1031*795d594fSAndroid Build Coastguard Worker     "b28AAAAAAAABAAAAAJmACAkAAAAAAAAAAQAAAAAAAAABAAAABAAAAHAAAAACAAAAAwAAAIAAAAAE"
1032*795d594fSAndroid Build Coastguard Worker     "AAAAAQAAAIwAAAAGAAAAAQAAAJQAAAACIAAABAAAALQAAAADEAAAAQAAAOgAAAAAIAAAAQAAAOwA"
1033*795d594fSAndroid Build Coastguard Worker     "AAAAEAAAAQAAAPQAAAA=";
1034*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,FieldAccessFlagsInterface)1035*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, FieldAccessFlagsInterface) {
1036*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1037*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1038*795d594fSAndroid Build Coastguard Worker       "field_flags_interface",
1039*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1040*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1041*795d594fSAndroid Build Coastguard Worker       },
1042*795d594fSAndroid Build Coastguard Worker       nullptr);
1043*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1044*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1045*795d594fSAndroid Build Coastguard Worker       "field_flags_interface",
1046*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1047*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
1048*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1049*795d594fSAndroid Build Coastguard Worker       },
1050*795d594fSAndroid Build Coastguard Worker       nullptr);
1051*795d594fSAndroid Build Coastguard Worker 
1052*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1053*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1054*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_non_public",
1055*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1056*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1057*795d594fSAndroid Build Coastguard Worker 
1058*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1059*795d594fSAndroid Build Coastguard Worker       },
1060*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
1061*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1062*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1063*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_non_public",
1064*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1065*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
1066*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1067*795d594fSAndroid Build Coastguard Worker 
1068*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1069*795d594fSAndroid Build Coastguard Worker       },
1070*795d594fSAndroid Build Coastguard Worker       "Interface field is not public final static");
1071*795d594fSAndroid Build Coastguard Worker 
1072*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1073*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1074*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_non_final",
1075*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1076*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1077*795d594fSAndroid Build Coastguard Worker 
1078*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccFinal);
1079*795d594fSAndroid Build Coastguard Worker       },
1080*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
1081*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1082*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1083*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_non_final",
1084*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1085*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
1086*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1087*795d594fSAndroid Build Coastguard Worker 
1088*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccFinal);
1089*795d594fSAndroid Build Coastguard Worker       },
1090*795d594fSAndroid Build Coastguard Worker       "Interface field is not public final static");
1091*795d594fSAndroid Build Coastguard Worker 
1092*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1093*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1094*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_protected",
1095*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1096*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1097*795d594fSAndroid Build Coastguard Worker 
1098*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1099*795d594fSAndroid Build Coastguard Worker         OrMaskToFieldFlags(dex_file, "foo", kAccProtected);
1100*795d594fSAndroid Build Coastguard Worker       },
1101*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
1102*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1103*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1104*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_protected",
1105*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1106*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
1107*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1108*795d594fSAndroid Build Coastguard Worker 
1109*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1110*795d594fSAndroid Build Coastguard Worker         OrMaskToFieldFlags(dex_file, "foo", kAccProtected);
1111*795d594fSAndroid Build Coastguard Worker       },
1112*795d594fSAndroid Build Coastguard Worker       "Interface field is not public final static");
1113*795d594fSAndroid Build Coastguard Worker 
1114*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1115*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1116*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_private",
1117*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1118*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1119*795d594fSAndroid Build Coastguard Worker 
1120*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1121*795d594fSAndroid Build Coastguard Worker         OrMaskToFieldFlags(dex_file, "foo", kAccPrivate);
1122*795d594fSAndroid Build Coastguard Worker       },
1123*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
1124*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1125*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1126*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_private",
1127*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1128*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
1129*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1130*795d594fSAndroid Build Coastguard Worker 
1131*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1132*795d594fSAndroid Build Coastguard Worker         OrMaskToFieldFlags(dex_file, "foo", kAccPrivate);
1133*795d594fSAndroid Build Coastguard Worker       },
1134*795d594fSAndroid Build Coastguard Worker       "Interface field is not public final static");
1135*795d594fSAndroid Build Coastguard Worker 
1136*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1137*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceTestDex,
1138*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_synthetic",
1139*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1140*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1141*795d594fSAndroid Build Coastguard Worker 
1142*795d594fSAndroid Build Coastguard Worker         OrMaskToFieldFlags(dex_file, "foo", kAccSynthetic);
1143*795d594fSAndroid Build Coastguard Worker       },
1144*795d594fSAndroid Build Coastguard Worker       nullptr);
1145*795d594fSAndroid Build Coastguard Worker 
1146*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kAllFieldFlags =
1147*795d594fSAndroid Build Coastguard Worker       kAccPublic |
1148*795d594fSAndroid Build Coastguard Worker       kAccPrivate |
1149*795d594fSAndroid Build Coastguard Worker       kAccProtected |
1150*795d594fSAndroid Build Coastguard Worker       kAccStatic |
1151*795d594fSAndroid Build Coastguard Worker       kAccFinal |
1152*795d594fSAndroid Build Coastguard Worker       kAccVolatile |
1153*795d594fSAndroid Build Coastguard Worker       kAccTransient |
1154*795d594fSAndroid Build Coastguard Worker       kAccSynthetic |
1155*795d594fSAndroid Build Coastguard Worker       kAccEnum;
1156*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kInterfaceFieldFlags = kAccPublic | kAccStatic | kAccFinal | kAccSynthetic;
1157*795d594fSAndroid Build Coastguard Worker   constexpr uint32_t kInterfaceDisallowed = kAllFieldFlags &
1158*795d594fSAndroid Build Coastguard Worker                                             ~kInterfaceFieldFlags &
1159*795d594fSAndroid Build Coastguard Worker                                             ~kAccProtected &
1160*795d594fSAndroid Build Coastguard Worker                                             ~kAccPrivate;
1161*795d594fSAndroid Build Coastguard Worker   static_assert(kInterfaceDisallowed != 0, "There should be disallowed flags.");
1162*795d594fSAndroid Build Coastguard Worker 
1163*795d594fSAndroid Build Coastguard Worker   uint32_t bits = POPCOUNT(kInterfaceDisallowed);
1164*795d594fSAndroid Build Coastguard Worker   for (uint32_t i = 1; i < (1u << bits); ++i) {
1165*795d594fSAndroid Build Coastguard Worker     VerifyModification(
1166*795d594fSAndroid Build Coastguard Worker         kFieldFlagsInterfaceTestDex,
1167*795d594fSAndroid Build Coastguard Worker         "field_flags_interface_disallowed",
1168*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
1169*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1170*795d594fSAndroid Build Coastguard Worker 
1171*795d594fSAndroid Build Coastguard Worker           uint32_t mask = ApplyMaskShifted(kInterfaceDisallowed, i);
1172*795d594fSAndroid Build Coastguard Worker           if ((mask & kAccProtected) != 0) {
1173*795d594fSAndroid Build Coastguard Worker             mask &= ~kAccProtected;
1174*795d594fSAndroid Build Coastguard Worker             ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1175*795d594fSAndroid Build Coastguard Worker           }
1176*795d594fSAndroid Build Coastguard Worker           OrMaskToFieldFlags(dex_file, "foo", mask);
1177*795d594fSAndroid Build Coastguard Worker         },
1178*795d594fSAndroid Build Coastguard Worker         nullptr);  // Should be allowed in older dex versions for backwards compatibility.
1179*795d594fSAndroid Build Coastguard Worker     VerifyModification(
1180*795d594fSAndroid Build Coastguard Worker         kFieldFlagsInterfaceTestDex,
1181*795d594fSAndroid Build Coastguard Worker         "field_flags_interface_disallowed",
1182*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
1183*795d594fSAndroid Build Coastguard Worker           MakeDexVersion37(dex_file);
1184*795d594fSAndroid Build Coastguard Worker           ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1185*795d594fSAndroid Build Coastguard Worker 
1186*795d594fSAndroid Build Coastguard Worker           uint32_t mask = ApplyMaskShifted(kInterfaceDisallowed, i);
1187*795d594fSAndroid Build Coastguard Worker           if ((mask & kAccProtected) != 0) {
1188*795d594fSAndroid Build Coastguard Worker             mask &= ~kAccProtected;
1189*795d594fSAndroid Build Coastguard Worker             ApplyMaskToFieldFlags(dex_file, "foo", ~kAccPublic);
1190*795d594fSAndroid Build Coastguard Worker           }
1191*795d594fSAndroid Build Coastguard Worker           OrMaskToFieldFlags(dex_file, "foo", mask);
1192*795d594fSAndroid Build Coastguard Worker         },
1193*795d594fSAndroid Build Coastguard Worker         "Interface field has disallowed flag");
1194*795d594fSAndroid Build Coastguard Worker   }
1195*795d594fSAndroid Build Coastguard Worker }
1196*795d594fSAndroid Build Coastguard Worker 
1197*795d594fSAndroid Build Coastguard Worker // Standard bad interface. Needs to be separate from class as interfaces do not allow instance
1198*795d594fSAndroid Build Coastguard Worker // fields. Use declared-synchronized again for 3B encoding.
1199*795d594fSAndroid Build Coastguard Worker //
1200*795d594fSAndroid Build Coastguard Worker // .class public interface LInterfaceFieldFlags;
1201*795d594fSAndroid Build Coastguard Worker // .super Ljava/lang/Object;
1202*795d594fSAndroid Build Coastguard Worker //
1203*795d594fSAndroid Build Coastguard Worker // .field declared-synchronized public final foo:I
1204*795d594fSAndroid Build Coastguard Worker 
1205*795d594fSAndroid Build Coastguard Worker static const char kFieldFlagsInterfaceBadTestDex[] =
1206*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQByMUnqYKHBkUpvvNp+9CnZ2VyDkKnRN6VkAQAAcAAAAHhWNBIAAAAAAAAAAPQAAAAE"
1207*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAMAAACAAAAAAAAAAAAAAAABAAAAjAAAAAAAAAAAAAAAAQAAAJQAAACwAAAAtAAAALQA"
1208*795d594fSAndroid Build Coastguard Worker     "AAC3AAAAzgAAAOIAAAAAAAAAAQAAAAIAAAABAAAAAwAAAAEAAAABAgAAAgAAAAAAAAD/////AAAA"
1209*795d594fSAndroid Build Coastguard Worker     "AOwAAAAAAAAAAUkAFUxJbnRlcmZhY2VGaWVsZEZsYWdzOwASTGphdmEvbGFuZy9PYmplY3Q7AANm"
1210*795d594fSAndroid Build Coastguard Worker     "b28AAAAAAAAAAQAAAJGACAkAAAAAAAAAAQAAAAAAAAABAAAABAAAAHAAAAACAAAAAwAAAIAAAAAE"
1211*795d594fSAndroid Build Coastguard Worker     "AAAAAQAAAIwAAAAGAAAAAQAAAJQAAAACIAAABAAAALQAAAADEAAAAQAAAOgAAAAAIAAAAQAAAOwA"
1212*795d594fSAndroid Build Coastguard Worker     "AAAAEAAAAQAAAPQAAAA=";
1213*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,FieldAccessFlagsInterfaceNonStatic)1214*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, FieldAccessFlagsInterfaceNonStatic) {
1215*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1216*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceBadTestDex,
1217*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_non_static",
1218*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1219*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1220*795d594fSAndroid Build Coastguard Worker       },
1221*795d594fSAndroid Build Coastguard Worker       nullptr);  // Should be allowed in older dex versions for backwards compatibility.
1222*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1223*795d594fSAndroid Build Coastguard Worker       kFieldFlagsInterfaceBadTestDex,
1224*795d594fSAndroid Build Coastguard Worker       "field_flags_interface_non_static",
1225*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1226*795d594fSAndroid Build Coastguard Worker         MakeDexVersion37(dex_file);
1227*795d594fSAndroid Build Coastguard Worker         ApplyMaskToFieldFlags(dex_file, "foo", ~kAccDeclaredSynchronized);
1228*795d594fSAndroid Build Coastguard Worker       },
1229*795d594fSAndroid Build Coastguard Worker       "Interface field is not public final static");
1230*795d594fSAndroid Build Coastguard Worker }
1231*795d594fSAndroid Build Coastguard Worker 
1232*795d594fSAndroid Build Coastguard Worker // Generated from:
1233*795d594fSAndroid Build Coastguard Worker //
1234*795d594fSAndroid Build Coastguard Worker // .class public LTest;
1235*795d594fSAndroid Build Coastguard Worker // .super Ljava/lang/Object;
1236*795d594fSAndroid Build Coastguard Worker // .source "Test.java"
1237*795d594fSAndroid Build Coastguard Worker //
1238*795d594fSAndroid Build Coastguard Worker // .method public constructor <init>()V
1239*795d594fSAndroid Build Coastguard Worker //     .registers 1
1240*795d594fSAndroid Build Coastguard Worker //
1241*795d594fSAndroid Build Coastguard Worker //     .prologue
1242*795d594fSAndroid Build Coastguard Worker //     .line 1
1243*795d594fSAndroid Build Coastguard Worker //     invoke-direct {p0}, Ljava/lang/Object;-><init>()V
1244*795d594fSAndroid Build Coastguard Worker //
1245*795d594fSAndroid Build Coastguard Worker //     return-void
1246*795d594fSAndroid Build Coastguard Worker // .end method
1247*795d594fSAndroid Build Coastguard Worker //
1248*795d594fSAndroid Build Coastguard Worker // .method public static main()V
1249*795d594fSAndroid Build Coastguard Worker //     .registers 2
1250*795d594fSAndroid Build Coastguard Worker //
1251*795d594fSAndroid Build Coastguard Worker //     const-string v0, "a"
1252*795d594fSAndroid Build Coastguard Worker //     const-string v0, "b"
1253*795d594fSAndroid Build Coastguard Worker //     const-string v0, "c"
1254*795d594fSAndroid Build Coastguard Worker //     const-string v0, "d"
1255*795d594fSAndroid Build Coastguard Worker //     const-string v0, "e"
1256*795d594fSAndroid Build Coastguard Worker //     const-string v0, "f"
1257*795d594fSAndroid Build Coastguard Worker //     const-string v0, "g"
1258*795d594fSAndroid Build Coastguard Worker //     const-string v0, "h"
1259*795d594fSAndroid Build Coastguard Worker //     const-string v0, "i"
1260*795d594fSAndroid Build Coastguard Worker //     const-string v0, "j"
1261*795d594fSAndroid Build Coastguard Worker //     const-string v0, "k"
1262*795d594fSAndroid Build Coastguard Worker //
1263*795d594fSAndroid Build Coastguard Worker //     .local v1, "local_var":Ljava/lang/String;
1264*795d594fSAndroid Build Coastguard Worker //     const-string v1, "test"
1265*795d594fSAndroid Build Coastguard Worker // .end method
1266*795d594fSAndroid Build Coastguard Worker 
1267*795d594fSAndroid Build Coastguard Worker static const char kDebugInfoTestDex[] =
1268*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQCHRkHix2eIMQgvLD/0VGrlllZLo0Rb6VyUAgAAcAAAAHhWNBIAAAAAAAAAAAwCAAAU"
1269*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAQAAADAAAAAAQAAANAAAAAAAAAAAAAAAAMAAADcAAAAAQAAAPQAAACAAQAAFAEAABQB"
1270*795d594fSAndroid Build Coastguard Worker     "AAAcAQAAJAEAADgBAABMAQAAVwEAAFoBAABdAQAAYAEAAGMBAABmAQAAaQEAAGwBAABvAQAAcgEA"
1271*795d594fSAndroid Build Coastguard Worker     "AHUBAAB4AQAAewEAAIYBAACMAQAAAQAAAAIAAAADAAAABQAAAAUAAAADAAAAAAAAAAAAAAAAAAAA"
1272*795d594fSAndroid Build Coastguard Worker     "AAAAABIAAAABAAAAAAAAAAAAAAABAAAAAQAAAAAAAAAEAAAAAAAAAPwBAAAAAAAABjxpbml0PgAG"
1273*795d594fSAndroid Build Coastguard Worker     "TFRlc3Q7ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcvU3RyaW5nOwAJVGVzdC5qYXZh"
1274*795d594fSAndroid Build Coastguard Worker     "AAFWAAFhAAFiAAFjAAFkAAFlAAFmAAFnAAFoAAFpAAFqAAFrAAlsb2NhbF92YXIABG1haW4ABHRl"
1275*795d594fSAndroid Build Coastguard Worker     "c3QAAAABAAcOAAAAARYDARIDAAAAAQABAAEAAACUAQAABAAAAHAQAgAAAA4AAgAAAAAAAACZAQAA"
1276*795d594fSAndroid Build Coastguard Worker     "GAAAABoABgAaAAcAGgAIABoACQAaAAoAGgALABoADAAaAA0AGgAOABoADwAaABAAGgETAAAAAgAA"
1277*795d594fSAndroid Build Coastguard Worker     "gYAEpAMBCbwDAAALAAAAAAAAAAEAAAAAAAAAAQAAABQAAABwAAAAAgAAAAQAAADAAAAAAwAAAAEA"
1278*795d594fSAndroid Build Coastguard Worker     "AADQAAAABQAAAAMAAADcAAAABgAAAAEAAAD0AAAAAiAAABQAAAAUAQAAAyAAAAIAAACUAQAAASAA"
1279*795d594fSAndroid Build Coastguard Worker     "AAIAAACkAQAAACAAAAEAAAD8AQAAABAAAAEAAAAMAgAA";
1280*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,DebugInfoTypeIdxTest)1281*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, DebugInfoTypeIdxTest) {
1282*795d594fSAndroid Build Coastguard Worker   {
1283*795d594fSAndroid Build Coastguard Worker     // The input dex file should be good before modification.
1284*795d594fSAndroid Build Coastguard Worker     std::string error_msg;
1285*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kDebugInfoTestDex,
1286*795d594fSAndroid Build Coastguard Worker                                                          kLocationString,
1287*795d594fSAndroid Build Coastguard Worker                                                          &error_msg));
1288*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(raw.get() != nullptr) << error_msg;
1289*795d594fSAndroid Build Coastguard Worker   }
1290*795d594fSAndroid Build Coastguard Worker 
1291*795d594fSAndroid Build Coastguard Worker   // Modify the debug information entry.
1292*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1293*795d594fSAndroid Build Coastguard Worker       kDebugInfoTestDex,
1294*795d594fSAndroid Build Coastguard Worker       "debug_start_type_idx",
1295*795d594fSAndroid Build Coastguard Worker       [](DexFile* dex_file) {
1296*795d594fSAndroid Build Coastguard Worker         *(const_cast<uint8_t*>(dex_file->Begin()) + 416) = 0x14U;
1297*795d594fSAndroid Build Coastguard Worker       },
1298*795d594fSAndroid Build Coastguard Worker       "DBG_START_LOCAL type_idx");
1299*795d594fSAndroid Build Coastguard Worker }
1300*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,SectionAlignment)1301*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, SectionAlignment) {
1302*795d594fSAndroid Build Coastguard Worker   {
1303*795d594fSAndroid Build Coastguard Worker     // The input dex file should be good before modification. Any file is fine, as long as it
1304*795d594fSAndroid Build Coastguard Worker     // uses all sections.
1305*795d594fSAndroid Build Coastguard Worker     std::string error_msg;
1306*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kGoodTestDex,
1307*795d594fSAndroid Build Coastguard Worker                                                          kLocationString,
1308*795d594fSAndroid Build Coastguard Worker                                                          &error_msg));
1309*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(raw.get() != nullptr) << error_msg;
1310*795d594fSAndroid Build Coastguard Worker   }
1311*795d594fSAndroid Build Coastguard Worker 
1312*795d594fSAndroid Build Coastguard Worker   // Modify all section offsets to be unaligned.
1313*795d594fSAndroid Build Coastguard Worker   constexpr size_t kSections = 7;
1314*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < kSections; ++i) {
1315*795d594fSAndroid Build Coastguard Worker     VerifyModification(
1316*795d594fSAndroid Build Coastguard Worker         kGoodTestDex,
1317*795d594fSAndroid Build Coastguard Worker         "section_align",
1318*795d594fSAndroid Build Coastguard Worker         [&](DexFile* dex_file) {
1319*795d594fSAndroid Build Coastguard Worker           DexFile::Header* header = const_cast<DexFile::Header*>(
1320*795d594fSAndroid Build Coastguard Worker               reinterpret_cast<const DexFile::Header*>(dex_file->Begin()));
1321*795d594fSAndroid Build Coastguard Worker           uint32_t* off_ptr;
1322*795d594fSAndroid Build Coastguard Worker           switch (i) {
1323*795d594fSAndroid Build Coastguard Worker             case 0:
1324*795d594fSAndroid Build Coastguard Worker               off_ptr = &header->map_off_;
1325*795d594fSAndroid Build Coastguard Worker               break;
1326*795d594fSAndroid Build Coastguard Worker             case 1:
1327*795d594fSAndroid Build Coastguard Worker               off_ptr = &header->string_ids_off_;
1328*795d594fSAndroid Build Coastguard Worker               break;
1329*795d594fSAndroid Build Coastguard Worker             case 2:
1330*795d594fSAndroid Build Coastguard Worker               off_ptr = &header->type_ids_off_;
1331*795d594fSAndroid Build Coastguard Worker               break;
1332*795d594fSAndroid Build Coastguard Worker             case 3:
1333*795d594fSAndroid Build Coastguard Worker               off_ptr = &header->proto_ids_off_;
1334*795d594fSAndroid Build Coastguard Worker               break;
1335*795d594fSAndroid Build Coastguard Worker             case 4:
1336*795d594fSAndroid Build Coastguard Worker               off_ptr = &header->field_ids_off_;
1337*795d594fSAndroid Build Coastguard Worker               break;
1338*795d594fSAndroid Build Coastguard Worker             case 5:
1339*795d594fSAndroid Build Coastguard Worker               off_ptr = &header->method_ids_off_;
1340*795d594fSAndroid Build Coastguard Worker               break;
1341*795d594fSAndroid Build Coastguard Worker             case 6:
1342*795d594fSAndroid Build Coastguard Worker               off_ptr = &header->class_defs_off_;
1343*795d594fSAndroid Build Coastguard Worker               break;
1344*795d594fSAndroid Build Coastguard Worker 
1345*795d594fSAndroid Build Coastguard Worker             static_assert(kSections == 7, "kSections is wrong");
1346*795d594fSAndroid Build Coastguard Worker             default:
1347*795d594fSAndroid Build Coastguard Worker               LOG(FATAL) << "Unexpected section";
1348*795d594fSAndroid Build Coastguard Worker               UNREACHABLE();
1349*795d594fSAndroid Build Coastguard Worker           }
1350*795d594fSAndroid Build Coastguard Worker           ASSERT_TRUE(off_ptr != nullptr);
1351*795d594fSAndroid Build Coastguard Worker           ASSERT_NE(*off_ptr, 0U) << i;  // Should already contain a value (in use).
1352*795d594fSAndroid Build Coastguard Worker           (*off_ptr)++;                  // Add one, which should misalign it (all the sections
1353*795d594fSAndroid Build Coastguard Worker                                          // above are aligned by 4).
1354*795d594fSAndroid Build Coastguard Worker         },
1355*795d594fSAndroid Build Coastguard Worker         "should be aligned by 4 for");
1356*795d594fSAndroid Build Coastguard Worker   }
1357*795d594fSAndroid Build Coastguard Worker }
1358*795d594fSAndroid Build Coastguard Worker 
1359*795d594fSAndroid Build Coastguard Worker // Generated from
1360*795d594fSAndroid Build Coastguard Worker //
1361*795d594fSAndroid Build Coastguard Worker // .class LOverloading;
1362*795d594fSAndroid Build Coastguard Worker //
1363*795d594fSAndroid Build Coastguard Worker // .super Ljava/lang/Object;
1364*795d594fSAndroid Build Coastguard Worker //
1365*795d594fSAndroid Build Coastguard Worker // .method public static foo()V
1366*795d594fSAndroid Build Coastguard Worker // .registers 1
1367*795d594fSAndroid Build Coastguard Worker //     return-void
1368*795d594fSAndroid Build Coastguard Worker // .end method
1369*795d594fSAndroid Build Coastguard Worker //
1370*795d594fSAndroid Build Coastguard Worker // .method public static foo(I)V
1371*795d594fSAndroid Build Coastguard Worker // .registers 1
1372*795d594fSAndroid Build Coastguard Worker //     return-void
1373*795d594fSAndroid Build Coastguard Worker // .end method
1374*795d594fSAndroid Build Coastguard Worker static const char kProtoOrderingTestDex[] =
1375*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNQA1L+ABE6voQ9Lr4Ci//efB53oGnDr5PinsAQAAcAAAAHhWNBIAAAAAAAAAAFgBAAAG"
1376*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAQAAACIAAAAAgAAAJgAAAAAAAAAAAAAAAIAAACwAAAAAQAAAMAAAAAMAQAA4AAAAOAA"
1377*795d594fSAndroid Build Coastguard Worker     "AADjAAAA8gAAAAYBAAAJAQAADQEAAAAAAAABAAAAAgAAAAMAAAADAAAAAwAAAAAAAAAEAAAAAwAA"
1378*795d594fSAndroid Build Coastguard Worker     "ABQBAAABAAAABQAAAAEAAQAFAAAAAQAAAAAAAAACAAAAAAAAAP////8AAAAASgEAAAAAAAABSQAN"
1379*795d594fSAndroid Build Coastguard Worker     "TE92ZXJsb2FkaW5nOwASTGphdmEvbGFuZy9PYmplY3Q7AAFWAAJWSQADZm9vAAAAAQAAAAAAAAAA"
1380*795d594fSAndroid Build Coastguard Worker     "AAAAAAAAAAEAAAAAAAAAAAAAAAEAAAAOAAAAAQABAAAAAAAAAAAAAQAAAA4AAAACAAAJpAIBCbgC"
1381*795d594fSAndroid Build Coastguard Worker     "AAAMAAAAAAAAAAEAAAAAAAAAAQAAAAYAAABwAAAAAgAAAAQAAACIAAAAAwAAAAIAAACYAAAABQAA"
1382*795d594fSAndroid Build Coastguard Worker     "AAIAAACwAAAABgAAAAEAAADAAAAAAiAAAAYAAADgAAAAARAAAAEAAAAUAQAAAxAAAAIAAAAcAQAA"
1383*795d594fSAndroid Build Coastguard Worker     "ASAAAAIAAAAkAQAAACAAAAEAAABKAQAAABAAAAEAAABYAQAA";
1384*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,ProtoOrdering)1385*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, ProtoOrdering) {
1386*795d594fSAndroid Build Coastguard Worker   {
1387*795d594fSAndroid Build Coastguard Worker     // The input dex file should be good before modification.
1388*795d594fSAndroid Build Coastguard Worker     std::string error_msg;
1389*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<const DexFile> raw(OpenDexFileBase64(kProtoOrderingTestDex,
1390*795d594fSAndroid Build Coastguard Worker                                                          kLocationString,
1391*795d594fSAndroid Build Coastguard Worker                                                          &error_msg));
1392*795d594fSAndroid Build Coastguard Worker     ASSERT_TRUE(raw.get() != nullptr) << error_msg;
1393*795d594fSAndroid Build Coastguard Worker   }
1394*795d594fSAndroid Build Coastguard Worker 
1395*795d594fSAndroid Build Coastguard Worker   // Modify the order of the ProtoIds for two overloads of "foo" with the
1396*795d594fSAndroid Build Coastguard Worker   // same return type and one having longer parameter list than the other.
1397*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i != 2; ++i) {
1398*795d594fSAndroid Build Coastguard Worker     VerifyModification(
1399*795d594fSAndroid Build Coastguard Worker         kProtoOrderingTestDex,
1400*795d594fSAndroid Build Coastguard Worker         "proto_ordering",
1401*795d594fSAndroid Build Coastguard Worker         [i](DexFile* dex_file) {
1402*795d594fSAndroid Build Coastguard Worker           uint32_t method_idx;
1403*795d594fSAndroid Build Coastguard Worker           const uint8_t* data = FindMethodData(dex_file, "foo", &method_idx);
1404*795d594fSAndroid Build Coastguard Worker           CHECK(data != nullptr);
1405*795d594fSAndroid Build Coastguard Worker           // There should be 2 methods called "foo".
1406*795d594fSAndroid Build Coastguard Worker           CHECK_LT(method_idx + 1u, dex_file->NumMethodIds());
1407*795d594fSAndroid Build Coastguard Worker           CHECK_EQ(dex_file->GetMethodId(method_idx).name_idx_,
1408*795d594fSAndroid Build Coastguard Worker                    dex_file->GetMethodId(method_idx + 1).name_idx_);
1409*795d594fSAndroid Build Coastguard Worker           CHECK_EQ(dex_file->GetMethodId(method_idx).proto_idx_.index_ + 1u,
1410*795d594fSAndroid Build Coastguard Worker                    dex_file->GetMethodId(method_idx + 1).proto_idx_.index_);
1411*795d594fSAndroid Build Coastguard Worker           // Their return types should be the same.
1412*795d594fSAndroid Build Coastguard Worker           dex::ProtoIndex proto1_idx = dex_file->GetMethodId(method_idx).proto_idx_;
1413*795d594fSAndroid Build Coastguard Worker           const dex::ProtoId& proto1 = dex_file->GetProtoId(proto1_idx);
1414*795d594fSAndroid Build Coastguard Worker           dex::ProtoIndex proto2_idx(proto1_idx.index_ + 1u);
1415*795d594fSAndroid Build Coastguard Worker           const dex::ProtoId& proto2 = dex_file->GetProtoId(proto2_idx);
1416*795d594fSAndroid Build Coastguard Worker           CHECK_EQ(proto1.return_type_idx_, proto2.return_type_idx_);
1417*795d594fSAndroid Build Coastguard Worker           // And the first should not have any parameters while the second should have some.
1418*795d594fSAndroid Build Coastguard Worker           CHECK(!DexFileParameterIterator(*dex_file, proto1).HasNext());
1419*795d594fSAndroid Build Coastguard Worker           CHECK(DexFileParameterIterator(*dex_file, proto2).HasNext());
1420*795d594fSAndroid Build Coastguard Worker           if (i == 0) {
1421*795d594fSAndroid Build Coastguard Worker             // Swap the proto parameters and shorties to break the ordering.
1422*795d594fSAndroid Build Coastguard Worker             std::swap(const_cast<uint32_t&>(proto1.parameters_off_),
1423*795d594fSAndroid Build Coastguard Worker                       const_cast<uint32_t&>(proto2.parameters_off_));
1424*795d594fSAndroid Build Coastguard Worker             std::swap(const_cast<dex::StringIndex&>(proto1.shorty_idx_),
1425*795d594fSAndroid Build Coastguard Worker                       const_cast<dex::StringIndex&>(proto2.shorty_idx_));
1426*795d594fSAndroid Build Coastguard Worker           } else {
1427*795d594fSAndroid Build Coastguard Worker             // Copy the proto parameters and shorty to create duplicate proto id.
1428*795d594fSAndroid Build Coastguard Worker             const_cast<uint32_t&>(proto1.parameters_off_) = proto2.parameters_off_;
1429*795d594fSAndroid Build Coastguard Worker             const_cast<dex::StringIndex&>(proto1.shorty_idx_) = proto2.shorty_idx_;
1430*795d594fSAndroid Build Coastguard Worker           }
1431*795d594fSAndroid Build Coastguard Worker         },
1432*795d594fSAndroid Build Coastguard Worker         "Out-of-order proto_id arguments");
1433*795d594fSAndroid Build Coastguard Worker   }
1434*795d594fSAndroid Build Coastguard Worker }
1435*795d594fSAndroid Build Coastguard Worker 
1436*795d594fSAndroid Build Coastguard Worker // To generate a base64 encoded Dex file version 037 from Smali files, use:
1437*795d594fSAndroid Build Coastguard Worker //
1438*795d594fSAndroid Build Coastguard Worker //   smali assemble --api 24 -o classes.dex class1.smali [class2.smali ...]
1439*795d594fSAndroid Build Coastguard Worker //   base64 classes.dex >classes.dex.base64
1440*795d594fSAndroid Build Coastguard Worker 
1441*795d594fSAndroid Build Coastguard Worker // Dex file version 037 generated from:
1442*795d594fSAndroid Build Coastguard Worker //
1443*795d594fSAndroid Build Coastguard Worker //   .class public LB28685551;
1444*795d594fSAndroid Build Coastguard Worker //   .super LB28685551;
1445*795d594fSAndroid Build Coastguard Worker 
1446*795d594fSAndroid Build Coastguard Worker static const char kClassExtendsItselfTestDex[] =
1447*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNwDeGbgRg1kb6swszpcTWrrOAALB++F4OPT0AAAAcAAAAHhWNBIAAAAAAAAAAKgAAAAB"
1448*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAEAAAB0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAHgAAABcAAAAmAAAAJgA"
1449*795d594fSAndroid Build Coastguard Worker     "AAAAAAAAAAAAAAEAAAAAAAAAAAAAAP////8AAAAAAAAAAAAAAAALTEIyODY4NTU1MTsAAAAABgAA"
1450*795d594fSAndroid Build Coastguard Worker     "AAAAAAABAAAAAAAAAAEAAAABAAAAcAAAAAIAAAABAAAAdAAAAAYAAAABAAAAeAAAAAIgAAABAAAA"
1451*795d594fSAndroid Build Coastguard Worker     "mAAAAAAQAAABAAAAqAAAAA==";
1452*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,ClassExtendsItself)1453*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, ClassExtendsItself) {
1454*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1455*795d594fSAndroid Build Coastguard Worker       kClassExtendsItselfTestDex,
1456*795d594fSAndroid Build Coastguard Worker       "class_extends_itself",
1457*795d594fSAndroid Build Coastguard Worker       []([[maybe_unused]] DexFile* dex_file) { /* empty */ },
1458*795d594fSAndroid Build Coastguard Worker       "Class with same type idx as its superclass: '0'");
1459*795d594fSAndroid Build Coastguard Worker }
1460*795d594fSAndroid Build Coastguard Worker 
1461*795d594fSAndroid Build Coastguard Worker // Dex file version 037 generated from:
1462*795d594fSAndroid Build Coastguard Worker //
1463*795d594fSAndroid Build Coastguard Worker //   .class public LFoo;
1464*795d594fSAndroid Build Coastguard Worker //   .super LBar;
1465*795d594fSAndroid Build Coastguard Worker //
1466*795d594fSAndroid Build Coastguard Worker // and:
1467*795d594fSAndroid Build Coastguard Worker //
1468*795d594fSAndroid Build Coastguard Worker //    .class public LBar;
1469*795d594fSAndroid Build Coastguard Worker //    .super LFoo;
1470*795d594fSAndroid Build Coastguard Worker 
1471*795d594fSAndroid Build Coastguard Worker static const char kClassesExtendOneAnotherTestDex[] =
1472*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNwBXHSrwpDMwRBkg+L+JeQCuFNRLhQ86duEcAQAAcAAAAHhWNBIAAAAAAAAAANAAAAAC"
1473*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAIAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAIAAAABcAAAAwAAAAMAA"
1474*795d594fSAndroid Build Coastguard Worker     "AADHAAAAAAAAAAEAAAABAAAAAQAAAAAAAAAAAAAA/////wAAAAAAAAAAAAAAAAAAAAABAAAAAQAA"
1475*795d594fSAndroid Build Coastguard Worker     "AAAAAAD/////AAAAAAAAAAAAAAAABUxCYXI7AAVMRm9vOwAAAAYAAAAAAAAAAQAAAAAAAAABAAAA"
1476*795d594fSAndroid Build Coastguard Worker     "AgAAAHAAAAACAAAAAgAAAHgAAAAGAAAAAgAAAIAAAAACIAAAAgAAAMAAAAAAEAAAAQAAANAAAAA=";
1477*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,ClassesExtendOneAnother)1478*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, ClassesExtendOneAnother) {
1479*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1480*795d594fSAndroid Build Coastguard Worker       kClassesExtendOneAnotherTestDex,
1481*795d594fSAndroid Build Coastguard Worker       "classes_extend_one_another",
1482*795d594fSAndroid Build Coastguard Worker       []([[maybe_unused]] DexFile* dex_file) { /* empty */ },
1483*795d594fSAndroid Build Coastguard Worker       "Invalid class definition ordering: class with type idx: '1' defined before"
1484*795d594fSAndroid Build Coastguard Worker       " superclass with type idx: '0'");
1485*795d594fSAndroid Build Coastguard Worker }
1486*795d594fSAndroid Build Coastguard Worker 
1487*795d594fSAndroid Build Coastguard Worker // Dex file version 037 generated from:
1488*795d594fSAndroid Build Coastguard Worker //
1489*795d594fSAndroid Build Coastguard Worker //   .class public LAll;
1490*795d594fSAndroid Build Coastguard Worker //   .super LYour;
1491*795d594fSAndroid Build Coastguard Worker //
1492*795d594fSAndroid Build Coastguard Worker // and:
1493*795d594fSAndroid Build Coastguard Worker //
1494*795d594fSAndroid Build Coastguard Worker //   .class public LYour;
1495*795d594fSAndroid Build Coastguard Worker //   .super LBase;
1496*795d594fSAndroid Build Coastguard Worker //
1497*795d594fSAndroid Build Coastguard Worker // and:
1498*795d594fSAndroid Build Coastguard Worker //
1499*795d594fSAndroid Build Coastguard Worker //   .class public LBase;
1500*795d594fSAndroid Build Coastguard Worker //   .super LAll;
1501*795d594fSAndroid Build Coastguard Worker 
1502*795d594fSAndroid Build Coastguard Worker static const char kCircularClassInheritanceTestDex[] =
1503*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNwBMJxgP0SJz6oLXnKfl+J7lSEORLRwF5LNMAQAAcAAAAHhWNBIAAAAAAAAAAAABAAAD"
1504*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAMAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAIgAAABkAAAA6AAAAOgA"
1505*795d594fSAndroid Build Coastguard Worker     "AADvAAAA9wAAAAAAAAABAAAAAgAAAAEAAAABAAAAAAAAAAAAAAD/////AAAAAAAAAAAAAAAAAgAA"
1506*795d594fSAndroid Build Coastguard Worker     "AAEAAAABAAAAAAAAAP////8AAAAAAAAAAAAAAAAAAAAAAQAAAAIAAAAAAAAA/////wAAAAAAAAAA"
1507*795d594fSAndroid Build Coastguard Worker     "AAAAAAVMQWxsOwAGTEJhc2U7AAZMWW91cjsAAAYAAAAAAAAAAQAAAAAAAAABAAAAAwAAAHAAAAAC"
1508*795d594fSAndroid Build Coastguard Worker     "AAAAAwAAAHwAAAAGAAAAAwAAAIgAAAACIAAAAwAAAOgAAAAAEAAAAQAAAAABAAA=";
1509*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,CircularClassInheritance)1510*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, CircularClassInheritance) {
1511*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1512*795d594fSAndroid Build Coastguard Worker       kCircularClassInheritanceTestDex,
1513*795d594fSAndroid Build Coastguard Worker       "circular_class_inheritance",
1514*795d594fSAndroid Build Coastguard Worker       []([[maybe_unused]] DexFile* dex_file) { /* empty */ },
1515*795d594fSAndroid Build Coastguard Worker       "Invalid class definition ordering: class with type idx: '1' defined before"
1516*795d594fSAndroid Build Coastguard Worker       " superclass with type idx: '0'");
1517*795d594fSAndroid Build Coastguard Worker }
1518*795d594fSAndroid Build Coastguard Worker 
1519*795d594fSAndroid Build Coastguard Worker // Dex file version 037 generated from:
1520*795d594fSAndroid Build Coastguard Worker //
1521*795d594fSAndroid Build Coastguard Worker //   .class public abstract interface LInterfaceImplementsItself;
1522*795d594fSAndroid Build Coastguard Worker //   .super Ljava/lang/Object;
1523*795d594fSAndroid Build Coastguard Worker //   .implements LInterfaceImplementsItself;
1524*795d594fSAndroid Build Coastguard Worker 
1525*795d594fSAndroid Build Coastguard Worker static const char kInterfaceImplementsItselfTestDex[] =
1526*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNwCKKrjatp8XbXl5S/bEVJnqaBhjZkQY4440AQAAcAAAAHhWNBIAAAAAAAAAANwAAAAC"
1527*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAIAAAB4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAIAAAACUAAAAoAAAAKAA"
1528*795d594fSAndroid Build Coastguard Worker     "AAC9AAAAAAAAAAEAAAAAAAAAAQYAAAEAAADUAAAA/////wAAAAAAAAAAAAAAABtMSW50ZXJmYWNl"
1529*795d594fSAndroid Build Coastguard Worker     "SW1wbGVtZW50c0l0c2VsZjsAEkxqYXZhL2xhbmcvT2JqZWN0OwAAAAABAAAAAAAAAAcAAAAAAAAA"
1530*795d594fSAndroid Build Coastguard Worker     "AQAAAAAAAAABAAAAAgAAAHAAAAACAAAAAgAAAHgAAAAGAAAAAQAAAIAAAAACIAAAAgAAAKAAAAAB"
1531*795d594fSAndroid Build Coastguard Worker     "EAAAAQAAANQAAAAAEAAAAQAAANwAAAA=";
1532*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,InterfaceImplementsItself)1533*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, InterfaceImplementsItself) {
1534*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1535*795d594fSAndroid Build Coastguard Worker       kInterfaceImplementsItselfTestDex,
1536*795d594fSAndroid Build Coastguard Worker       "interface_implements_itself",
1537*795d594fSAndroid Build Coastguard Worker       []([[maybe_unused]] DexFile* dex_file) { /* empty */ },
1538*795d594fSAndroid Build Coastguard Worker       "Class with same type idx as implemented interface: '0'");
1539*795d594fSAndroid Build Coastguard Worker }
1540*795d594fSAndroid Build Coastguard Worker 
1541*795d594fSAndroid Build Coastguard Worker // Dex file version 037 generated from:
1542*795d594fSAndroid Build Coastguard Worker //
1543*795d594fSAndroid Build Coastguard Worker //   .class public abstract interface LPing;
1544*795d594fSAndroid Build Coastguard Worker //   .super Ljava/lang/Object;
1545*795d594fSAndroid Build Coastguard Worker //   .implements LPong;
1546*795d594fSAndroid Build Coastguard Worker //
1547*795d594fSAndroid Build Coastguard Worker // and:
1548*795d594fSAndroid Build Coastguard Worker //
1549*795d594fSAndroid Build Coastguard Worker //   .class public abstract interface LPong;
1550*795d594fSAndroid Build Coastguard Worker //   .super Ljava/lang/Object;
1551*795d594fSAndroid Build Coastguard Worker //   .implements LPing;
1552*795d594fSAndroid Build Coastguard Worker 
1553*795d594fSAndroid Build Coastguard Worker static const char kInterfacesImplementOneAnotherTestDex[] =
1554*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNwD0Kk9sxlYdg3Dy1Cff0gQCuJAQfEP6ohZUAQAAcAAAAHhWNBIAAAAAAAAAAPwAAAAD"
1555*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAMAAAB8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAIgAAACMAAAAyAAAAMgA"
1556*795d594fSAndroid Build Coastguard Worker     "AADQAAAA2AAAAAAAAAABAAAAAgAAAAEAAAABBgAAAgAAAOwAAAD/////AAAAAAAAAAAAAAAAAAAA"
1557*795d594fSAndroid Build Coastguard Worker     "AAEGAAACAAAA9AAAAP////8AAAAAAAAAAAAAAAAGTFBpbmc7AAZMUG9uZzsAEkxqYXZhL2xhbmcv"
1558*795d594fSAndroid Build Coastguard Worker     "T2JqZWN0OwABAAAAAAAAAAEAAAABAAAABwAAAAAAAAABAAAAAAAAAAEAAAADAAAAcAAAAAIAAAAD"
1559*795d594fSAndroid Build Coastguard Worker     "AAAAfAAAAAYAAAACAAAAiAAAAAIgAAADAAAAyAAAAAEQAAACAAAA7AAAAAAQAAABAAAA/AAAAA==";
1560*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,InterfacesImplementOneAnother)1561*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, InterfacesImplementOneAnother) {
1562*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1563*795d594fSAndroid Build Coastguard Worker       kInterfacesImplementOneAnotherTestDex,
1564*795d594fSAndroid Build Coastguard Worker       "interfaces_implement_one_another",
1565*795d594fSAndroid Build Coastguard Worker       []([[maybe_unused]] DexFile* dex_file) { /* empty */ },
1566*795d594fSAndroid Build Coastguard Worker       "Invalid class definition ordering: class with type idx: '1' defined before"
1567*795d594fSAndroid Build Coastguard Worker       " implemented interface with type idx: '0'");
1568*795d594fSAndroid Build Coastguard Worker }
1569*795d594fSAndroid Build Coastguard Worker 
1570*795d594fSAndroid Build Coastguard Worker // Dex file version 037 generated from:
1571*795d594fSAndroid Build Coastguard Worker //
1572*795d594fSAndroid Build Coastguard Worker //   .class public abstract interface LA;
1573*795d594fSAndroid Build Coastguard Worker //   .super Ljava/lang/Object;
1574*795d594fSAndroid Build Coastguard Worker //   .implements LB;
1575*795d594fSAndroid Build Coastguard Worker //
1576*795d594fSAndroid Build Coastguard Worker // and:
1577*795d594fSAndroid Build Coastguard Worker //
1578*795d594fSAndroid Build Coastguard Worker //   .class public abstract interface LB;
1579*795d594fSAndroid Build Coastguard Worker //   .super Ljava/lang/Object;
1580*795d594fSAndroid Build Coastguard Worker //   .implements LC;
1581*795d594fSAndroid Build Coastguard Worker //
1582*795d594fSAndroid Build Coastguard Worker // and:
1583*795d594fSAndroid Build Coastguard Worker //
1584*795d594fSAndroid Build Coastguard Worker //   .class public abstract interface LC;
1585*795d594fSAndroid Build Coastguard Worker //   .super Ljava/lang/Object;
1586*795d594fSAndroid Build Coastguard Worker //   .implements LA;
1587*795d594fSAndroid Build Coastguard Worker 
1588*795d594fSAndroid Build Coastguard Worker static const char kCircularInterfaceImplementationTestDex[] =
1589*795d594fSAndroid Build Coastguard Worker     "ZGV4CjAzNwCzKmD5Fol6XAU6ichYHcUTIP7Z7MdTcEmEAQAAcAAAAHhWNBIAAAAAAAAAACwBAAAE"
1590*795d594fSAndroid Build Coastguard Worker     "AAAAcAAAAAQAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAJAAAACUAAAA8AAAAPAA"
1591*795d594fSAndroid Build Coastguard Worker     "AAD1AAAA+gAAAP8AAAAAAAAAAQAAAAIAAAADAAAAAgAAAAEGAAADAAAAHAEAAP////8AAAAAAAAA"
1592*795d594fSAndroid Build Coastguard Worker     "AAAAAAABAAAAAQYAAAMAAAAUAQAA/////wAAAAAAAAAAAAAAAAAAAAABBgAAAwAAACQBAAD/////"
1593*795d594fSAndroid Build Coastguard Worker     "AAAAAAAAAAAAAAAAA0xBOwADTEI7AANMQzsAEkxqYXZhL2xhbmcvT2JqZWN0OwAAAQAAAAIAAAAB"
1594*795d594fSAndroid Build Coastguard Worker     "AAAAAAAAAAEAAAABAAAABwAAAAAAAAABAAAAAAAAAAEAAAAEAAAAcAAAAAIAAAAEAAAAgAAAAAYA"
1595*795d594fSAndroid Build Coastguard Worker     "AAADAAAAkAAAAAIgAAAEAAAA8AAAAAEQAAADAAAAFAEAAAAQAAABAAAALAEAAA==";
1596*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,CircularInterfaceImplementation)1597*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, CircularInterfaceImplementation) {
1598*795d594fSAndroid Build Coastguard Worker   VerifyModification(
1599*795d594fSAndroid Build Coastguard Worker       kCircularInterfaceImplementationTestDex,
1600*795d594fSAndroid Build Coastguard Worker       "circular_interface_implementation",
1601*795d594fSAndroid Build Coastguard Worker       []([[maybe_unused]] DexFile* dex_file) { /* empty */ },
1602*795d594fSAndroid Build Coastguard Worker       "Invalid class definition ordering: class with type idx: '2' defined before"
1603*795d594fSAndroid Build Coastguard Worker       " implemented interface with type idx: '0'");
1604*795d594fSAndroid Build Coastguard Worker }
1605*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,Checksum)1606*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, Checksum) {
1607*795d594fSAndroid Build Coastguard Worker   size_t length;
1608*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kGoodTestDex, &length));
1609*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
1610*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
1611*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
1612*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
1613*795d594fSAndroid Build Coastguard Worker 
1614*795d594fSAndroid Build Coastguard Worker   // Good checksum: all pass.
1615*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(dex::Verify(dex_file.get(),
1616*795d594fSAndroid Build Coastguard Worker                           "good checksum, no verify",
1617*795d594fSAndroid Build Coastguard Worker                           /*verify_checksum=*/false,
1618*795d594fSAndroid Build Coastguard Worker                           &error_msg));
1619*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(dex::Verify(dex_file.get(),
1620*795d594fSAndroid Build Coastguard Worker                           "good checksum, verify",
1621*795d594fSAndroid Build Coastguard Worker                           /*verify_checksum=*/true,
1622*795d594fSAndroid Build Coastguard Worker                           &error_msg));
1623*795d594fSAndroid Build Coastguard Worker 
1624*795d594fSAndroid Build Coastguard Worker   // Bad checksum: !verify_checksum passes verify_checksum fails.
1625*795d594fSAndroid Build Coastguard Worker   DexFile::Header* header = reinterpret_cast<DexFile::Header*>(
1626*795d594fSAndroid Build Coastguard Worker       const_cast<uint8_t*>(dex_file->Begin()));
1627*795d594fSAndroid Build Coastguard Worker   header->checksum_ = 0;
1628*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(dex::Verify(dex_file.get(),
1629*795d594fSAndroid Build Coastguard Worker                           "bad checksum, no verify",
1630*795d594fSAndroid Build Coastguard Worker                           /*verify_checksum=*/false,
1631*795d594fSAndroid Build Coastguard Worker                           &error_msg));
1632*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(dex::Verify(dex_file.get(),
1633*795d594fSAndroid Build Coastguard Worker                            "bad checksum, verify",
1634*795d594fSAndroid Build Coastguard Worker                            /*verify_checksum=*/true,
1635*795d594fSAndroid Build Coastguard Worker                            &error_msg));
1636*795d594fSAndroid Build Coastguard Worker   EXPECT_NE(error_msg.find("Bad checksum"), std::string::npos) << error_msg;
1637*795d594fSAndroid Build Coastguard Worker }
1638*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,BadStaticMethodName)1639*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, BadStaticMethodName) {
1640*795d594fSAndroid Build Coastguard Worker   // Generated DEX file version (037) from:
1641*795d594fSAndroid Build Coastguard Worker   //
1642*795d594fSAndroid Build Coastguard Worker   // .class public LBadName;
1643*795d594fSAndroid Build Coastguard Worker   // .super Ljava/lang/Object;
1644*795d594fSAndroid Build Coastguard Worker   //
1645*795d594fSAndroid Build Coastguard Worker   // .method public static <bad_name> (II)V
1646*795d594fSAndroid Build Coastguard Worker   //    .registers 2
1647*795d594fSAndroid Build Coastguard Worker   //    .prologue
1648*795d594fSAndroid Build Coastguard Worker   //    return-void
1649*795d594fSAndroid Build Coastguard Worker   // .end method
1650*795d594fSAndroid Build Coastguard Worker   //
1651*795d594fSAndroid Build Coastguard Worker   // .method public constructor <init>()V
1652*795d594fSAndroid Build Coastguard Worker   //     .registers 1
1653*795d594fSAndroid Build Coastguard Worker   //     .prologue
1654*795d594fSAndroid Build Coastguard Worker   //     .line 1
1655*795d594fSAndroid Build Coastguard Worker   // invoke-direct {p0}, Ljava/lang/Object;-><init>()V
1656*795d594fSAndroid Build Coastguard Worker   //     return-void
1657*795d594fSAndroid Build Coastguard Worker   // .end method
1658*795d594fSAndroid Build Coastguard Worker   //
1659*795d594fSAndroid Build Coastguard Worker   static const char kDexBase64[] =
1660*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNwC2NYlwyxEc/h6hv+hMeUVQPtiX6MQBcfgwAgAAcAAAAHhWNBIAAAAAAAAAAJABAAAI"
1661*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAABAAQAA8AAAAPAA"
1662*795d594fSAndroid Build Coastguard Worker       "AAD8AAAABAEAABIBAAAVAQAAIAEAADQBAAA3AQAAAwAAAAQAAAAFAAAABgAAAAYAAAADAAAAAAAA"
1663*795d594fSAndroid Build Coastguard Worker       "AAcAAAADAAAAPAEAAAEAAQAAAAAAAQAAAAEAAAACAAAAAQAAAAEAAAABAAAAAgAAAAAAAAACAAAA"
1664*795d594fSAndroid Build Coastguard Worker       "AAAAAIABAAAAAAAACjxiYWRfbmFtZT4ABjxpbml0PgAMQmFkTmFtZS5qYXZhAAFJAAlMQmFkTmFt"
1665*795d594fSAndroid Build Coastguard Worker       "ZTsAEkxqYXZhL2xhbmcvT2JqZWN0OwABVgADVklJAAIAAAAAAAAAAAAAAAACAAAHAAEABw4AAAIA"
1666*795d594fSAndroid Build Coastguard Worker       "AgAAAAAASAEAAAEAAAAOAAAAAQABAAEAAABOAQAABAAAAHAQAgAAAA4AAAACAAAJ1AIBgYAE6AIA"
1667*795d594fSAndroid Build Coastguard Worker       "AA0AAAAAAAAAAQAAAAAAAAABAAAACAAAAHAAAAACAAAABAAAAJAAAAADAAAAAgAAAKAAAAAFAAAA"
1668*795d594fSAndroid Build Coastguard Worker       "AwAAALgAAAAGAAAAAQAAANAAAAACIAAACAAAAPAAAAABEAAAAQAAADwBAAADEAAAAQAAAEQBAAAD"
1669*795d594fSAndroid Build Coastguard Worker       "IAAAAgAAAEgBAAABIAAAAgAAAFQBAAAAIAAAAQAAAIABAAAAEAAAAQAAAJABAAA=";
1670*795d594fSAndroid Build Coastguard Worker 
1671*795d594fSAndroid Build Coastguard Worker   size_t length;
1672*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kDexBase64, &length));
1673*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
1674*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
1675*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
1676*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
1677*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(dex::Verify(dex_file.get(),
1678*795d594fSAndroid Build Coastguard Worker                            "bad static method name",
1679*795d594fSAndroid Build Coastguard Worker                            /*verify_checksum=*/true,
1680*795d594fSAndroid Build Coastguard Worker                            &error_msg));
1681*795d594fSAndroid Build Coastguard Worker }
1682*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,BadVirtualMethodName)1683*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, BadVirtualMethodName) {
1684*795d594fSAndroid Build Coastguard Worker   // Generated DEX file version (037) from:
1685*795d594fSAndroid Build Coastguard Worker   //
1686*795d594fSAndroid Build Coastguard Worker   //  .class public LBadVirtualName;
1687*795d594fSAndroid Build Coastguard Worker   //  .super Ljava/lang/Object;
1688*795d594fSAndroid Build Coastguard Worker   //
1689*795d594fSAndroid Build Coastguard Worker   //  .method public <bad_name> (II)V
1690*795d594fSAndroid Build Coastguard Worker   //     .registers 2
1691*795d594fSAndroid Build Coastguard Worker   //     return-void
1692*795d594fSAndroid Build Coastguard Worker   //  .end method
1693*795d594fSAndroid Build Coastguard Worker   //
1694*795d594fSAndroid Build Coastguard Worker   //  .method public constructor <init>()V
1695*795d594fSAndroid Build Coastguard Worker   //      .registers 1
1696*795d594fSAndroid Build Coastguard Worker   //      invoke-direct {p0}, Ljava/lang/Object;-><init>()V
1697*795d594fSAndroid Build Coastguard Worker   //      return-void
1698*795d594fSAndroid Build Coastguard Worker   //  .end method
1699*795d594fSAndroid Build Coastguard Worker   //
1700*795d594fSAndroid Build Coastguard Worker   static const char kDexBase64[] =
1701*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNwDcPC8B2E7kYTZmeHX2u2IqrpWV9EXBHpE8AgAAcAAAAHhWNBIAAAAAAAAAAJwBAAAI"
1702*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAABMAQAA8AAAAPAA"
1703*795d594fSAndroid Build Coastguard Worker       "AAD8AAAABAEAABkBAAAcAQAALgEAAEIBAABFAQAAAwAAAAQAAAAFAAAABgAAAAYAAAADAAAAAAAA"
1704*795d594fSAndroid Build Coastguard Worker       "AAcAAAADAAAATAEAAAEAAQAAAAAAAQAAAAEAAAACAAAAAQAAAAEAAAABAAAAAgAAAAAAAAACAAAA"
1705*795d594fSAndroid Build Coastguard Worker       "AAAAAI4BAAAAAAAACjxiYWRfbmFtZT4ABjxpbml0PgATQmFkVmlydHVhbE5hbWUuamF2YQABSQAQ"
1706*795d594fSAndroid Build Coastguard Worker       "TEJhZFZpcnR1YWxOYW1lOwASTGphdmEvbGFuZy9PYmplY3Q7AAFWAANWSUkAAAACAAAAAAAAAAAA"
1707*795d594fSAndroid Build Coastguard Worker       "AAABAAcOAAACAAAHAAABAAEAAQAAAFgBAAAEAAAAcBACAAAADgADAAMAAAAAAF0BAAABAAAADgAA"
1708*795d594fSAndroid Build Coastguard Worker       "AAEBAYGABOQCAAH8Ag0AAAAAAAAAAQAAAAAAAAABAAAACAAAAHAAAAACAAAABAAAAJAAAAADAAAA"
1709*795d594fSAndroid Build Coastguard Worker       "AgAAAKAAAAAFAAAAAwAAALgAAAAGAAAAAQAAANAAAAACIAAACAAAAPAAAAABEAAAAQAAAEwBAAAD"
1710*795d594fSAndroid Build Coastguard Worker       "EAAAAQAAAFQBAAADIAAAAgAAAFgBAAABIAAAAgAAAGQBAAAAIAAAAQAAAI4BAAAAEAAAAQAAAJwB"
1711*795d594fSAndroid Build Coastguard Worker       "AAA=";
1712*795d594fSAndroid Build Coastguard Worker 
1713*795d594fSAndroid Build Coastguard Worker   size_t length;
1714*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kDexBase64, &length));
1715*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
1716*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
1717*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
1718*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
1719*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(dex::Verify(dex_file.get(),
1720*795d594fSAndroid Build Coastguard Worker                            "bad virtual method name",
1721*795d594fSAndroid Build Coastguard Worker                            /*verify_checksum=*/true,
1722*795d594fSAndroid Build Coastguard Worker                            &error_msg));
1723*795d594fSAndroid Build Coastguard Worker }
1724*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,BadClinitSignature)1725*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, BadClinitSignature) {
1726*795d594fSAndroid Build Coastguard Worker   // Generated DEX file version (037) from:
1727*795d594fSAndroid Build Coastguard Worker   //
1728*795d594fSAndroid Build Coastguard Worker   //  .class public LOneClinitBadSig;
1729*795d594fSAndroid Build Coastguard Worker   //  .super Ljava/lang/Object;
1730*795d594fSAndroid Build Coastguard Worker   //
1731*795d594fSAndroid Build Coastguard Worker   //  .method public static constructor <clinit>(II)V
1732*795d594fSAndroid Build Coastguard Worker   //     .registers 2
1733*795d594fSAndroid Build Coastguard Worker   //     return-void
1734*795d594fSAndroid Build Coastguard Worker   //  .end method
1735*795d594fSAndroid Build Coastguard Worker   //
1736*795d594fSAndroid Build Coastguard Worker   //  .method public constructor <init>()V
1737*795d594fSAndroid Build Coastguard Worker   //      .registers 1
1738*795d594fSAndroid Build Coastguard Worker   //      invoke-direct {p0}, Ljava/lang/Object;-><init>()V
1739*795d594fSAndroid Build Coastguard Worker   //      return-void
1740*795d594fSAndroid Build Coastguard Worker   //  .end method
1741*795d594fSAndroid Build Coastguard Worker   //
1742*795d594fSAndroid Build Coastguard Worker   static const char kDexBase64[] =
1743*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNwBNOwTbfJmWq5eMOlxUY4EICGiEGJMVg8RAAgAAcAAAAHhWNBIAAAAAAAAAAKABAAAI"
1744*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAAQAAACQAAAAAgAAAKAAAAAAAAAAAAAAAAMAAAC4AAAAAQAAANAAAABQAQAA8AAAAPAA"
1745*795d594fSAndroid Build Coastguard Worker       "AAD6AAAAAgEAAAUBAAAYAQAALAEAAEIBAABFAQAAAgAAAAMAAAAEAAAABgAAAAYAAAADAAAAAAAA"
1746*795d594fSAndroid Build Coastguard Worker       "AAcAAAADAAAATAEAAAEAAQAAAAAAAQAAAAEAAAACAAAAAQAAAAEAAAABAAAAAgAAAAAAAAAFAAAA"
1747*795d594fSAndroid Build Coastguard Worker       "AAAAAJABAAAAAAAACDxjbGluaXQ+AAY8aW5pdD4AAUkAEUxPbmVDbGluaXRCYWRTaWc7ABJMamF2"
1748*795d594fSAndroid Build Coastguard Worker       "YS9sYW5nL09iamVjdDsAFE9uZUNsaW5pdEJhZFNpZy5qYXZhAAFWAANWSUkAAAACAAAAAAAAAAAA"
1749*795d594fSAndroid Build Coastguard Worker       "AAAAAgAABwABAAcOAAACAAIAAAAAAFgBAAABAAAADgAAAAEAAQABAAAAXgEAAAQAAABwEAIAAAAO"
1750*795d594fSAndroid Build Coastguard Worker       "AAAAAgAAiYAE5AIBgYAE+AINAAAAAAAAAAEAAAAAAAAAAQAAAAgAAABwAAAAAgAAAAQAAACQAAAA"
1751*795d594fSAndroid Build Coastguard Worker       "AwAAAAIAAACgAAAABQAAAAMAAAC4AAAABgAAAAEAAADQAAAAAiAAAAgAAADwAAAAARAAAAEAAABM"
1752*795d594fSAndroid Build Coastguard Worker       "AQAAAxAAAAEAAABUAQAAAyAAAAIAAABYAQAAASAAAAIAAABkAQAAACAAAAEAAACQAQAAABAAAAEA"
1753*795d594fSAndroid Build Coastguard Worker       "AACgAQAA";
1754*795d594fSAndroid Build Coastguard Worker 
1755*795d594fSAndroid Build Coastguard Worker   size_t length;
1756*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kDexBase64, &length));
1757*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
1758*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
1759*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
1760*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
1761*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(dex::Verify(dex_file.get(),
1762*795d594fSAndroid Build Coastguard Worker                            "bad clinit signature",
1763*795d594fSAndroid Build Coastguard Worker                            /*verify_checksum=*/true,
1764*795d594fSAndroid Build Coastguard Worker                            &error_msg));
1765*795d594fSAndroid Build Coastguard Worker }
1766*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,BadClinitSignatureAgain)1767*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, BadClinitSignatureAgain) {
1768*795d594fSAndroid Build Coastguard Worker   // Generated DEX file version (037) from:
1769*795d594fSAndroid Build Coastguard Worker   //
1770*795d594fSAndroid Build Coastguard Worker   //  .class public LOneClinitBadSigAgain;
1771*795d594fSAndroid Build Coastguard Worker   //  .super Ljava/lang/Object;
1772*795d594fSAndroid Build Coastguard Worker   //
1773*795d594fSAndroid Build Coastguard Worker   //  .method public static constructor <clinit>()I
1774*795d594fSAndroid Build Coastguard Worker   //     .registers 1
1775*795d594fSAndroid Build Coastguard Worker   //     const/4 v0, 1
1776*795d594fSAndroid Build Coastguard Worker   //     return v0
1777*795d594fSAndroid Build Coastguard Worker   //  .end method
1778*795d594fSAndroid Build Coastguard Worker   //
1779*795d594fSAndroid Build Coastguard Worker   //  .method public constructor <init>()V
1780*795d594fSAndroid Build Coastguard Worker   //      .registers 1
1781*795d594fSAndroid Build Coastguard Worker   //      invoke-direct {p0}, Ljava/lang/Object;-><init>()V
1782*795d594fSAndroid Build Coastguard Worker   //      return-void
1783*795d594fSAndroid Build Coastguard Worker   //  .end method
1784*795d594fSAndroid Build Coastguard Worker   //
1785*795d594fSAndroid Build Coastguard Worker   static const char kDexBase64[] =
1786*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNwBfPcPu5NVwKUqZIu/YR8xqVlVD5UzTk0gEAgAAcAAAAHhWNBIAAAAAAAAAAIgBAAAH"
1787*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAAQAAACMAAAAAgAAAJwAAAAAAAAAAAAAAAMAAAC0AAAAAQAAAMwAAAAYAQAA7AAAAOwA"
1788*795d594fSAndroid Build Coastguard Worker       "AAD2AAAA/gAAAAEBAAAZAQAALQEAAEgBAAACAAAAAwAAAAQAAAAGAAAAAgAAAAAAAAAAAAAABgAA"
1789*795d594fSAndroid Build Coastguard Worker       "AAMAAAAAAAAAAQAAAAAAAAABAAEAAQAAAAIAAQABAAAAAQAAAAEAAAACAAAAAAAAAAUAAAAAAAAA"
1790*795d594fSAndroid Build Coastguard Worker       "eAEAAAAAAAAIPGNsaW5pdD4ABjxpbml0PgABSQAWTE9uZUNsaW5pdEJhZFNpZ0FnYWluOwASTGph"
1791*795d594fSAndroid Build Coastguard Worker       "dmEvbGFuZy9PYmplY3Q7ABlPbmVDbGluaXRCYWRTaWdBZ2Fpbi5qYXZhAAFWAAABAAAAAAAAAAAA"
1792*795d594fSAndroid Build Coastguard Worker       "AAACAAAAEhAPAAEAAQABAAAAAAAAAAQAAABwEAIAAAAOAAAAAgAAiYAEzAIBgYAE4AIKAAAAAAAA"
1793*795d594fSAndroid Build Coastguard Worker       "AAEAAAAAAAAAAQAAAAcAAABwAAAAAgAAAAQAAACMAAAAAwAAAAIAAACcAAAABQAAAAMAAAC0AAAA"
1794*795d594fSAndroid Build Coastguard Worker       "BgAAAAEAAADMAAAAAiAAAAcAAADsAAAAASAAAAIAAABMAQAAACAAAAEAAAB4AQAAABAAAAEAAACI"
1795*795d594fSAndroid Build Coastguard Worker       "AQAA";
1796*795d594fSAndroid Build Coastguard Worker 
1797*795d594fSAndroid Build Coastguard Worker   size_t length;
1798*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kDexBase64, &length));
1799*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
1800*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
1801*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
1802*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
1803*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(dex::Verify(dex_file.get(),
1804*795d594fSAndroid Build Coastguard Worker                            "bad clinit signature",
1805*795d594fSAndroid Build Coastguard Worker                            /*verify_checksum=*/true,
1806*795d594fSAndroid Build Coastguard Worker                            &error_msg));
1807*795d594fSAndroid Build Coastguard Worker }
1808*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,BadInitSignature)1809*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, BadInitSignature) {
1810*795d594fSAndroid Build Coastguard Worker   // Generated DEX file version (037) from:
1811*795d594fSAndroid Build Coastguard Worker   //
1812*795d594fSAndroid Build Coastguard Worker   //  .class public LBadInitSig;
1813*795d594fSAndroid Build Coastguard Worker   //  .super Ljava/lang/Object;
1814*795d594fSAndroid Build Coastguard Worker   //
1815*795d594fSAndroid Build Coastguard Worker   //  .method public constructor <init>()I
1816*795d594fSAndroid Build Coastguard Worker   //      .registers 1
1817*795d594fSAndroid Build Coastguard Worker   //      invoke-direct {p0}, Ljava/lang/Object;-><init>()V
1818*795d594fSAndroid Build Coastguard Worker   //      const v0, 1
1819*795d594fSAndroid Build Coastguard Worker   //      return v0
1820*795d594fSAndroid Build Coastguard Worker   //  .end method
1821*795d594fSAndroid Build Coastguard Worker   //
1822*795d594fSAndroid Build Coastguard Worker   static const char kDexBase64[] =
1823*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNwCdMdeh1KoHWamF2Prq32LF39YZ78fV7q+wAQAAcAAAAHhWNBIAAAAAAAAAADQBAAAF"
1824*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAAQAAACEAAAAAgAAAJQAAAAAAAAAAAAAAAIAAACsAAAAAQAAALwAAADUAAAA3AAAANwA"
1825*795d594fSAndroid Build Coastguard Worker       "AADkAAAA5wAAAPUAAAAJAQAAAQAAAAIAAAADAAAABAAAAAEAAAAAAAAAAAAAAAQAAAADAAAAAAAA"
1826*795d594fSAndroid Build Coastguard Worker       "AAEAAAAAAAAAAgABAAAAAAABAAAAAQAAAAIAAAAAAAAA/////wAAAAAqAQAAAAAAAAY8aW5pdD4A"
1827*795d594fSAndroid Build Coastguard Worker       "AUkADExCYWRJbml0U2lnOwASTGphdmEvbGFuZy9PYmplY3Q7AAFWAAEAAQABAAAAAAAAAAcAAABw"
1828*795d594fSAndroid Build Coastguard Worker       "EAEAAAAUAAEAAAAPAAAAAQAAgYAEjAIKAAAAAAAAAAEAAAAAAAAAAQAAAAUAAABwAAAAAgAAAAQA"
1829*795d594fSAndroid Build Coastguard Worker       "AACEAAAAAwAAAAIAAACUAAAABQAAAAIAAACsAAAABgAAAAEAAAC8AAAAAiAAAAUAAADcAAAAASAA"
1830*795d594fSAndroid Build Coastguard Worker       "AAEAAAAMAQAAACAAAAEAAAAqAQAAABAAAAEAAAA0AQAA";
1831*795d594fSAndroid Build Coastguard Worker 
1832*795d594fSAndroid Build Coastguard Worker   size_t length;
1833*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kDexBase64, &length));
1834*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
1835*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
1836*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
1837*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
1838*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(dex::Verify(dex_file.get(),
1839*795d594fSAndroid Build Coastguard Worker                            "bad init signature",
1840*795d594fSAndroid Build Coastguard Worker                            /*verify_checksum=*/true,
1841*795d594fSAndroid Build Coastguard Worker                            &error_msg));
1842*795d594fSAndroid Build Coastguard Worker }
1843*795d594fSAndroid Build Coastguard Worker 
1844*795d594fSAndroid Build Coastguard Worker static const char* kInvokeCustomDexFiles[] = {
1845*795d594fSAndroid Build Coastguard Worker   // TODO(oth): Revisit this test when we have smali / dx support.
1846*795d594fSAndroid Build Coastguard Worker   // https://cs.corp.google.com/android/toolchain/jack/jack-tests/tests/com/android/jack/java7/invokecustom/test001/Tests.java
1847*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzOAAEj12s/acmmdGuDL92SWSBh6iLBjxgomWkCAAAcAAAAHhWNBIAAAAAAAAAALwHAAAx"
1848*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAABYAAAA0AQAACQAAAIwBAAADAAAA+AEAAAsAAAAQAgAAAQAAAHACAAAMBgAAmAIAAMID"
1849*795d594fSAndroid Build Coastguard Worker   "AADKAwAAzQMAANIDAADhAwAA5AMAAOoDAAAfBAAAUgQAAIMEAAC4BAAA1AQAAOsEAAD+BAAAEgUA"
1850*795d594fSAndroid Build Coastguard Worker   "ACYFAAA6BQAAUQUAAG4FAACTBQAAtAUAAN0FAAD/BQAAHgYAADgGAABKBgAAVgYAAFkGAABdBgAA"
1851*795d594fSAndroid Build Coastguard Worker   "YgYAAGYGAAB7BgAAgAYAAI8GAACdBgAAtAYAAMMGAADSBgAA3gYAAPIGAAD4BgAABgcAAA4HAAAU"
1852*795d594fSAndroid Build Coastguard Worker   "BwAAGgcAAB8HAAAoBwAANAcAADoHAAABAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0A"
1853*795d594fSAndroid Build Coastguard Worker   "AAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABoAAAAeAAAAAgAA"
1854*795d594fSAndroid Build Coastguard Worker   "AAAAAACMAwAABQAAAAwAAACUAwAABQAAAA4AAACgAwAABAAAAA8AAAAAAAAAGgAAABQAAAAAAAAA"
1855*795d594fSAndroid Build Coastguard Worker   "GwAAABQAAACsAwAAHAAAABQAAACMAwAAHQAAABQAAAC0AwAAHQAAABQAAAC8AwAAAwADAAMAAAAE"
1856*795d594fSAndroid Build Coastguard Worker   "AAwAJAAAAAoABgAsAAAABAAEAAAAAAAEAAAAHwAAAAQAAQAoAAAABAAIACoAAAAEAAQALwAAAAYA"
1857*795d594fSAndroid Build Coastguard Worker   "BQAtAAAACAAEAAAAAAANAAcAAAAAAA8AAgAlAAAAEAADACkAAAASAAYAIQAAAJYHAACWBwAABAAA"
1858*795d594fSAndroid Build Coastguard Worker   "AAEAAAAIAAAAAAAAABkAAABkAwAAnQcAAAAAAAAEAAAAAgAAAAEAAABjBwAAAQAAAIsHAAACAAAA"
1859*795d594fSAndroid Build Coastguard Worker   "iwcAAJMHAAABAAEAAQAAAEEHAAAEAAAAcBAGAAAADgADAAIAAAAAAEYHAAADAAAAkAABAg8AAAAF"
1860*795d594fSAndroid Build Coastguard Worker   "AAMABAAAAE0HAAAQAAAAcQAJAAAADAAcAQQAbkAIABBDDAAiAQ0AcCAHAAEAEQEEAAEAAgAAAFYH"
1861*795d594fSAndroid Build Coastguard Worker   "AAAMAAAAYgACABIhEjL8IAAAIQAKAW4gBQAQAA4AAwABAAIAAABdBwAACwAAABIgEjH8IAEAEAAK"
1862*795d594fSAndroid Build Coastguard Worker   "ABJRcSAKAAEADgAAAAAAAAAAAAAAAwAAAAAAAAABAAAAmAIAAAIAAACgAgAABAAAAKgCAAACAAAA"
1863*795d594fSAndroid Build Coastguard Worker   "AAAAAAMAAAAPAAkAEQAAAAMAAAAHAAkAEQAAAAEAAAAAAAAAAQAAAA4AAAABAAAAFQAGPGluaXQ+"
1864*795d594fSAndroid Build Coastguard Worker   "AAFJAANJSUkADUlOVk9LRV9TVEFUSUMAAUwABExMTEwAM0xjb20vYW5kcm9pZC9qYWNrL2Fubm90"
1865*795d594fSAndroid Build Coastguard Worker   "YXRpb25zL0NhbGxlZEJ5SW52b2tlQ3VzdG9tOwAxTGNvbS9hbmRyb2lkL2phY2svYW5ub3RhdGlv"
1866*795d594fSAndroid Build Coastguard Worker   "bnMvTGlua2VyTWV0aG9kSGFuZGxlOwAvTGNvbS9hbmRyb2lkL2phY2svYW5ub3RhdGlvbnMvTWV0"
1867*795d594fSAndroid Build Coastguard Worker   "aG9kSGFuZGxlS2luZDsAM0xjb20vYW5kcm9pZC9qYWNrL2phdmE3L2ludm9rZWN1c3RvbS90ZXN0"
1868*795d594fSAndroid Build Coastguard Worker   "MDAxL1Rlc3RzOwAaTGRhbHZpay9hbm5vdGF0aW9uL1Rocm93czsAFUxqYXZhL2lvL1ByaW50U3Ry"
1869*795d594fSAndroid Build Coastguard Worker   "ZWFtOwARTGphdmEvbGFuZy9DbGFzczsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9T"
1870*795d594fSAndroid Build Coastguard Worker   "dHJpbmc7ABJMamF2YS9sYW5nL1N5c3RlbTsAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwAbTGphdmEv"
1871*795d594fSAndroid Build Coastguard Worker   "bGFuZy9pbnZva2UvQ2FsbFNpdGU7ACNMamF2YS9sYW5nL2ludm9rZS9Db25zdGFudENhbGxTaXRl"
1872*795d594fSAndroid Build Coastguard Worker   "OwAfTGphdmEvbGFuZy9pbnZva2UvTWV0aG9kSGFuZGxlOwAnTGphdmEvbGFuZy9pbnZva2UvTWV0"
1873*795d594fSAndroid Build Coastguard Worker   "aG9kSGFuZGxlcyRMb29rdXA7ACBMamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzOwAdTGph"
1874*795d594fSAndroid Build Coastguard Worker   "dmEvbGFuZy9pbnZva2UvTWV0aG9kVHlwZTsAGExqdW5pdC9mcmFtZXdvcmsvQXNzZXJ0OwAQTG9y"
1875*795d594fSAndroid Build Coastguard Worker   "Zy9qdW5pdC9UZXN0OwAKVGVzdHMuamF2YQABVgACVkkAA1ZJSQACVkwAE1tMamF2YS9sYW5nL1N0"
1876*795d594fSAndroid Build Coastguard Worker   "cmluZzsAA2FkZAANYXJndW1lbnRUeXBlcwAMYXNzZXJ0RXF1YWxzABVlbWl0dGVyOiBqYWNrLTQu"
1877*795d594fSAndroid Build Coastguard Worker   "MC1lbmcADWVuY2xvc2luZ1R5cGUADWZpZWxkQ2FsbFNpdGUACmZpbmRTdGF0aWMAEmludm9rZU1l"
1878*795d594fSAndroid Build Coastguard Worker   "dGhvZEhhbmRsZQAEa2luZAAMbGlua2VyTWV0aG9kAAZsb29rdXAABG1haW4ABG5hbWUAA291dAAH"
1879*795d594fSAndroid Build Coastguard Worker   "cHJpbnRsbgAKcmV0dXJuVHlwZQAEdGVzdAAFdmFsdWUAIgAHDgAvAgAABw4ANQMAAAAHDqUAPwEA"
1880*795d594fSAndroid Build Coastguard Worker   "Bw60ADsABw6lAAABBCAcAhgAGAAmHAEdAgQgHAMYDxgJGBEjGAQnGwArFygrFx8uGAACBQEwHAEY"
1881*795d594fSAndroid Build Coastguard Worker   "CwETAAMWABcfFQABAAQBAQkAgYAEtAUBCswFAQrkBQEJlAYEAbwGAAAAEwAAAAAAAAABAAAAAAAA"
1882*795d594fSAndroid Build Coastguard Worker   "AAEAAAAxAAAAcAAAAAIAAAAWAAAANAEAAAMAAAAJAAAAjAEAAAQAAAADAAAA+AEAAAUAAAALAAAA"
1883*795d594fSAndroid Build Coastguard Worker   "EAIAAAcAAAACAAAAaAIAAAYAAAABAAAAcAIAAAgAAAABAAAAkAIAAAMQAAADAAAAmAIAAAEgAAAF"
1884*795d594fSAndroid Build Coastguard Worker   "AAAAtAIAAAYgAAABAAAAZAMAAAEQAAAGAAAAjAMAAAIgAAAxAAAAwgMAAAMgAAAFAAAAQQcAAAQg"
1885*795d594fSAndroid Build Coastguard Worker   "AAADAAAAYwcAAAUgAAABAAAAlgcAAAAgAAABAAAAnQcAAAAQAAABAAAAvAcAAA==",
1886*795d594fSAndroid Build Coastguard Worker   // https://cs.corp.google.com/android/toolchain/jack/jack-tests/tests/com/android/jack/java7/invokecustom/test002/Tests.java
1887*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzOAAzq3aGAwKhT4QQj4lqNfZJAO8Tm24uTyNICQAAcAAAAHhWNBIAAAAAAAAAAGAIAAA2"
1888*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAABgAAABIAQAACQAAAKgBAAAEAAAAFAIAAA0AAAA0AgAAAQAAAKQCAAB8BgAAzAIAACYE"
1889*795d594fSAndroid Build Coastguard Worker   "AAAwBAAAOAQAAEQEAABHBAAATAQAAE8EAABVBAAAigQAALwEAADtBAAAIgUAAD4FAABVBQAAaAUA"
1890*795d594fSAndroid Build Coastguard Worker   "AH0FAACRBQAApQUAALkFAADQBQAA7QUAABIGAAAzBgAAXAYAAH4GAACdBgAAtwYAAMkGAADPBgAA"
1891*795d594fSAndroid Build Coastguard Worker   "2wYAAN4GAADiBgAA5wYAAOsGAAD/BgAAFAcAABkHAAAoBwAANgcAAE0HAABcBwAAawcAAH4HAACK"
1892*795d594fSAndroid Build Coastguard Worker   "BwAAkAcAAJgHAACeBwAAqgcAALAHAAC1BwAAxgcAAM8HAADbBwAA4QcAAAMAAAAHAAAACAAAAAkA"
1893*795d594fSAndroid Build Coastguard Worker   "AAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAABIAAAATAAAAFAAAABUAAAAWAAAAFwAA"
1894*795d594fSAndroid Build Coastguard Worker   "ABgAAAAZAAAAGgAAAB0AAAAhAAAAIgAAAAQAAAAAAAAA8AMAAAYAAAAPAAAA+AMAAAUAAAAQAAAA"
1895*795d594fSAndroid Build Coastguard Worker   "AAAAAAYAAAASAAAABAQAAB0AAAAVAAAAAAAAAB4AAAAVAAAAEAQAAB8AAAAVAAAA8AMAACAAAAAV"
1896*795d594fSAndroid Build Coastguard Worker   "AAAAGAQAACAAAAAVAAAAIAQAAAMAAwACAAAABAANACgAAAAIAAcAGwAAAAsABgAwAAAABAAEAAAA"
1897*795d594fSAndroid Build Coastguard Worker   "AAAEAAQAAQAAAAQAAAAjAAAABAAIAC0AAAAEAAQANAAAAAYABQAyAAAACQAEAAEAAAAMAAQAMQAA"
1898*795d594fSAndroid Build Coastguard Worker   "AA4ABwABAAAAEAABACoAAAARAAIALAAAABIAAwAuAAAAEwAGACUAAAA4CAAAOAgAAAQAAAABAAAA"
1899*795d594fSAndroid Build Coastguard Worker   "CQAAAAAAAAAcAAAA0AMAAD8IAAAAAAAAAQAAAAEAAAABAAAADggAAAIAAAAtCAAANQgAAAgAAAAE"
1900*795d594fSAndroid Build Coastguard Worker   "AAEA6AcAACoAAABxAAoAAAAMABwBBAAbAiMAAABiAwIAYgQCABIVI1UWAGIGAgASB00GBQdxMAsA"
1901*795d594fSAndroid Build Coastguard Worker   "QwUMA25ACQAQMgwAIgEOAHAgCAABAGkBAQAOAA0AbhAHAAAAKPsAAAAAJAABAAEBDCUBAAEAAQAA"
1902*795d594fSAndroid Build Coastguard Worker   "APUHAAAEAAAAcBAGAAAADgADAAIAAAAAAPoHAAADAAAAkAABAg8AAAAEAAEAAgAAAAEIAAAMAAAA"
1903*795d594fSAndroid Build Coastguard Worker   "YgADABIhEjL8IAAAIQAKAW4gBQAQAA4AAwABAAIAAAAICAAACwAAABIgEjH8IAEAEAAKABJRcSAM"
1904*795d594fSAndroid Build Coastguard Worker   "AAEADgAAAAAAAAAAAAAAAgAAAAAAAAACAAAAzAIAAAQAAADUAgAAAgAAAAAAAAADAAAABwAKABIA"
1905*795d594fSAndroid Build Coastguard Worker   "AAADAAAABwAHABYAAAABAAAAAAAAAAEAAAAPAAAAAQAAABcACDxjbGluaXQ+AAY8aW5pdD4ACkdF"
1906*795d594fSAndroid Build Coastguard Worker   "VF9TVEFUSUMAAUkAA0lJSQABTAAETExMTAAzTGNvbS9hbmRyb2lkL2phY2svYW5ub3RhdGlvbnMv"
1907*795d594fSAndroid Build Coastguard Worker   "Q2FsbGVkQnlJbnZva2VDdXN0b207ADBMY29tL2FuZHJvaWQvamFjay9hbm5vdGF0aW9ucy9MaW5r"
1908*795d594fSAndroid Build Coastguard Worker   "ZXJGaWVsZEhhbmRsZTsAL0xjb20vYW5kcm9pZC9qYWNrL2Fubm90YXRpb25zL01ldGhvZEhhbmRs"
1909*795d594fSAndroid Build Coastguard Worker   "ZUtpbmQ7ADNMY29tL2FuZHJvaWQvamFjay9qYXZhNy9pbnZva2VjdXN0b20vdGVzdDAwMi9UZXN0"
1910*795d594fSAndroid Build Coastguard Worker   "czsAGkxkYWx2aWsvYW5ub3RhdGlvbi9UaHJvd3M7ABVMamF2YS9pby9QcmludFN0cmVhbTsAEUxq"
1911*795d594fSAndroid Build Coastguard Worker   "YXZhL2xhbmcvQ2xhc3M7ABNMamF2YS9sYW5nL0ludGVnZXI7ABJMamF2YS9sYW5nL09iamVjdDsA"
1912*795d594fSAndroid Build Coastguard Worker   "EkxqYXZhL2xhbmcvU3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07ABVMamF2YS9sYW5nL1Rocm93"
1913*795d594fSAndroid Build Coastguard Worker   "YWJsZTsAG0xqYXZhL2xhbmcvaW52b2tlL0NhbGxTaXRlOwAjTGphdmEvbGFuZy9pbnZva2UvQ29u"
1914*795d594fSAndroid Build Coastguard Worker   "c3RhbnRDYWxsU2l0ZTsAH0xqYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZTsAJ0xqYXZhL2xh"
1915*795d594fSAndroid Build Coastguard Worker   "bmcvaW52b2tlL01ldGhvZEhhbmRsZXMkTG9va3VwOwAgTGphdmEvbGFuZy9pbnZva2UvTWV0aG9k"
1916*795d594fSAndroid Build Coastguard Worker   "SGFuZGxlczsAHUxqYXZhL2xhbmcvaW52b2tlL01ldGhvZFR5cGU7ABhManVuaXQvZnJhbWV3b3Jr"
1917*795d594fSAndroid Build Coastguard Worker   "L0Fzc2VydDsAEExvcmcvanVuaXQvVGVzdDsABFRZUEUAClRlc3RzLmphdmEAAVYAAlZJAANWSUkA"
1918*795d594fSAndroid Build Coastguard Worker   "AlZMABJbTGphdmEvbGFuZy9DbGFzczsAE1tMamF2YS9sYW5nL1N0cmluZzsAA2FkZAANYXJndW1l"
1919*795d594fSAndroid Build Coastguard Worker   "bnRUeXBlcwAMYXNzZXJ0RXF1YWxzABVlbWl0dGVyOiBqYWNrLTQuMC1lbmcADWVuY2xvc2luZ1R5"
1920*795d594fSAndroid Build Coastguard Worker   "cGUADWZpZWxkQ2FsbFNpdGUAEWZpZWxkTWV0aG9kSGFuZGxlAApmaW5kU3RhdGljAARraW5kAAZs"
1921*795d594fSAndroid Build Coastguard Worker   "b29rdXAABG1haW4ACm1ldGhvZFR5cGUABG5hbWUAA291dAAPcHJpbnRTdGFja1RyYWNlAAdwcmlu"
1922*795d594fSAndroid Build Coastguard Worker   "dGxuAApyZXR1cm5UeXBlAAR0ZXN0AAV2YWx1ZQAoAAcOAR0PAnh3Jh4AIQAHDgA2AgAABw4APwEA"
1923*795d594fSAndroid Build Coastguard Worker   "Bw60ADsABw6lAAABBCQcAhgAGAApHAEdAgMnGAQrGwAvFygvFyMzGAACBQE1HAEYDAEUAAMWABcj"
1924*795d594fSAndroid Build Coastguard Worker   "FQABAAQBAQkAiIAE4AUBgYAE0AYBCugGAQmABwQBqAcAAAATAAAAAAAAAAEAAAAAAAAAAQAAADYA"
1925*795d594fSAndroid Build Coastguard Worker   "AABwAAAAAgAAABgAAABIAQAAAwAAAAkAAACoAQAABAAAAAQAAAAUAgAABQAAAA0AAAA0AgAABwAA"
1926*795d594fSAndroid Build Coastguard Worker   "AAIAAACcAgAABgAAAAEAAACkAgAACAAAAAEAAADEAgAAAxAAAAIAAADMAgAAASAAAAUAAADgAgAA"
1927*795d594fSAndroid Build Coastguard Worker   "BiAAAAEAAADQAwAAARAAAAYAAADwAwAAAiAAADYAAAAmBAAAAyAAAAUAAADoBwAABCAAAAMAAAAO"
1928*795d594fSAndroid Build Coastguard Worker   "CAAABSAAAAEAAAA4CAAAACAAAAEAAAA/CAAAABAAAAEAAABgCAAA",
1929*795d594fSAndroid Build Coastguard Worker   // https://cs.corp.google.com/android/toolchain/jack/jack-tests/tests/com/android/jack/java7/invokecustom/test003/Tests.java
1930*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzOABjnhkFatj30/7cHTCJsfr7vAjz9/p+Y+TcCAAAcAAAAHhWNBIAAAAAAAAAAPQHAAAx"
1931*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAABYAAAA0AQAACQAAAIwBAAADAAAA+AEAAAsAAAAQAgAAAQAAAHACAABEBgAAmAIAAOoD"
1932*795d594fSAndroid Build Coastguard Worker   "AADyAwAA9QMAAP4DAAANBAAAEAQAABYEAABLBAAAfgQAAK8EAADkBAAAAAUAABcFAAAqBQAAPgUA"
1933*795d594fSAndroid Build Coastguard Worker   "AFIFAABmBQAAfQUAAJoFAAC/BQAA4AUAAAkGAAArBgAASgYAAGQGAAB2BgAAggYAAIUGAACJBgAA"
1934*795d594fSAndroid Build Coastguard Worker   "jgYAAJIGAACnBgAArAYAALsGAADJBgAA4AYAAO8GAAD+BgAACgcAAB4HAAAkBwAAMgcAADoHAABA"
1935*795d594fSAndroid Build Coastguard Worker   "BwAARgcAAEsHAABUBwAAYAcAAGYHAAABAAAABgAAAAcAAAAIAAAACQAAAAoAAAALAAAADAAAAA0A"
1936*795d594fSAndroid Build Coastguard Worker   "AAAOAAAADwAAABAAAAARAAAAEgAAABMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABoAAAAeAAAAAgAA"
1937*795d594fSAndroid Build Coastguard Worker   "AAAAAACkAwAABQAAAAwAAAC0AwAABQAAAA4AAADAAwAABAAAAA8AAAAAAAAAGgAAABQAAAAAAAAA"
1938*795d594fSAndroid Build Coastguard Worker   "GwAAABQAAADMAwAAHAAAABQAAADUAwAAHQAAABQAAADcAwAAHQAAABQAAADkAwAAAwADAAMAAAAE"
1939*795d594fSAndroid Build Coastguard Worker   "AAwAJAAAAAoABgAsAAAABAAEAAAAAAAEAAAAHwAAAAQAAQAoAAAABAAIACoAAAAEAAQALwAAAAYA"
1940*795d594fSAndroid Build Coastguard Worker   "BQAtAAAACAAEAAAAAAANAAcAAAAAAA8AAgAlAAAAEAADACkAAAASAAYAIQAAAM4HAADOBwAABAAA"
1941*795d594fSAndroid Build Coastguard Worker   "AAEAAAAIAAAAAAAAABkAAAB8AwAA1QcAAAAAAAAEAAAAAgAAAAEAAACTBwAAAQAAAMMHAAACAAAA"
1942*795d594fSAndroid Build Coastguard Worker   "wwcAAMsHAAABAAEAAQAAAG0HAAAEAAAAcBAGAAAADgAHAAYAAAAAAHIHAAAHAAAAkAABArAwsECw"
1943*795d594fSAndroid Build Coastguard Worker   "ULBgDwAAAAUAAwAEAAAAfQcAABAAAABxAAkAAAAMABwBBABuQAgAEEMMACIBDQBwIAcAAQARAQgA"
1944*795d594fSAndroid Build Coastguard Worker   "AQACAAAAhgcAABAAAABiBgIAEhASIRIyEkMSVBJl/QYAAAAACgBuIAUABgAOAAcAAQACAAAAjQcA"
1945*795d594fSAndroid Build Coastguard Worker   "ABAAAAASEBIhEjISQxJUEmX9BgEAAAAKABMBFQBxIAoAAQAOAAAAAAAAAAAAAwAAAAAAAAABAAAA"
1946*795d594fSAndroid Build Coastguard Worker   "mAIAAAIAAACgAgAABAAAAKgCAAAGAAAAAAAAAAAAAAAAAAAAAwAAAA8ACQARAAAAAwAAAAcACQAR"
1947*795d594fSAndroid Build Coastguard Worker   "AAAAAQAAAAAAAAACAAAAAAAAAAEAAAAOAAAAAQAAABUABjxpbml0PgABSQAHSUlJSUlJSQANSU5W"
1948*795d594fSAndroid Build Coastguard Worker   "T0tFX1NUQVRJQwABTAAETExMTAAzTGNvbS9hbmRyb2lkL2phY2svYW5ub3RhdGlvbnMvQ2FsbGVk"
1949*795d594fSAndroid Build Coastguard Worker   "QnlJbnZva2VDdXN0b207ADFMY29tL2FuZHJvaWQvamFjay9hbm5vdGF0aW9ucy9MaW5rZXJNZXRo"
1950*795d594fSAndroid Build Coastguard Worker   "b2RIYW5kbGU7AC9MY29tL2FuZHJvaWQvamFjay9hbm5vdGF0aW9ucy9NZXRob2RIYW5kbGVLaW5k"
1951*795d594fSAndroid Build Coastguard Worker   "OwAzTGNvbS9hbmRyb2lkL2phY2svamF2YTcvaW52b2tlY3VzdG9tL3Rlc3QwMDMvVGVzdHM7ABpM"
1952*795d594fSAndroid Build Coastguard Worker   "ZGFsdmlrL2Fubm90YXRpb24vVGhyb3dzOwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABFMamF2YS9s"
1953*795d594fSAndroid Build Coastguard Worker   "YW5nL0NsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAEkxqYXZh"
1954*795d594fSAndroid Build Coastguard Worker   "L2xhbmcvU3lzdGVtOwAVTGphdmEvbGFuZy9UaHJvd2FibGU7ABtMamF2YS9sYW5nL2ludm9rZS9D"
1955*795d594fSAndroid Build Coastguard Worker   "YWxsU2l0ZTsAI0xqYXZhL2xhbmcvaW52b2tlL0NvbnN0YW50Q2FsbFNpdGU7AB9MamF2YS9sYW5n"
1956*795d594fSAndroid Build Coastguard Worker   "L2ludm9rZS9NZXRob2RIYW5kbGU7ACdMamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzJExv"
1957*795d594fSAndroid Build Coastguard Worker   "b2t1cDsAIExqYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXM7AB1MamF2YS9sYW5nL2ludm9r"
1958*795d594fSAndroid Build Coastguard Worker   "ZS9NZXRob2RUeXBlOwAYTGp1bml0L2ZyYW1ld29yay9Bc3NlcnQ7ABBMb3JnL2p1bml0L1Rlc3Q7"
1959*795d594fSAndroid Build Coastguard Worker   "AApUZXN0cy5qYXZhAAFWAAJWSQADVklJAAJWTAATW0xqYXZhL2xhbmcvU3RyaW5nOwADYWRkAA1h"
1960*795d594fSAndroid Build Coastguard Worker   "cmd1bWVudFR5cGVzAAxhc3NlcnRFcXVhbHMAFWVtaXR0ZXI6IGphY2stNC4wLWVuZwANZW5jbG9z"
1961*795d594fSAndroid Build Coastguard Worker   "aW5nVHlwZQANZmllbGRDYWxsU2l0ZQAKZmluZFN0YXRpYwASaW52b2tlTWV0aG9kSGFuZGxlAARr"
1962*795d594fSAndroid Build Coastguard Worker   "aW5kAAxsaW5rZXJNZXRob2QABmxvb2t1cAAEbWFpbgAEbmFtZQADb3V0AAdwcmludGxuAApyZXR1"
1963*795d594fSAndroid Build Coastguard Worker   "cm5UeXBlAAR0ZXN0AAV2YWx1ZQAiAAcOAC8GAAAAAAAABw4ANQMAAAAHDqUAPwEABw7wADsABw7w"
1964*795d594fSAndroid Build Coastguard Worker   "AAABBCAcBhgAGAAYABgAGAAYACYcAR0CBCAcAxgPGAkYESMYBCcbACsXKCsXHy4YAAIFATAcARgL"
1965*795d594fSAndroid Build Coastguard Worker   "ARMAAxYAFx8VAAEABAEBCQCBgAS0BQEKzAUBCuwFAQmcBgQBzAYAAAATAAAAAAAAAAEAAAAAAAAA"
1966*795d594fSAndroid Build Coastguard Worker   "AQAAADEAAABwAAAAAgAAABYAAAA0AQAAAwAAAAkAAACMAQAABAAAAAMAAAD4AQAABQAAAAsAAAAQ"
1967*795d594fSAndroid Build Coastguard Worker   "AgAABwAAAAIAAABoAgAABgAAAAEAAABwAgAACAAAAAEAAACQAgAAAxAAAAMAAACYAgAAASAAAAUA"
1968*795d594fSAndroid Build Coastguard Worker   "AAC0AgAABiAAAAEAAAB8AwAAARAAAAcAAACkAwAAAiAAADEAAADqAwAAAyAAAAUAAABtBwAABCAA"
1969*795d594fSAndroid Build Coastguard Worker   "AAMAAACTBwAABSAAAAEAAADOBwAAACAAAAEAAADVBwAAABAAAAEAAAD0BwAA",
1970*795d594fSAndroid Build Coastguard Worker   // https://cs.corp.google.com/android/toolchain/jack/jack-tests/tests/com/android/jack/java7/invokecustom/test004/Tests.java
1971*795d594fSAndroid Build Coastguard Worker   "ZGV4CjAzOABvUVfbV74qWbSOEsgKP+EzahlNQLW2/8TMDAAAcAAAAHhWNBIAAAAAAAAAAOQLAABS"
1972*795d594fSAndroid Build Coastguard Worker   "AAAAcAAAAB8AAAC4AQAAEAAAADQCAAADAAAA9AIAABIAAAAMAwAAAQAAAKQDAAAACQAAzAMAANYF"
1973*795d594fSAndroid Build Coastguard Worker   "AADZBQAA4QUAAOkFAADsBQAA7wUAAPIFAAD1BQAA/AUAAP8FAAAEBgAAEwYAABYGAAAZBgAAHwYA"
1974*795d594fSAndroid Build Coastguard Worker   "AC8GAABkBgAAjQYAAMAGAADxBgAAJgcAAEUHAABhBwAAeAcAAIoHAACdBwAAsQcAAMUHAADZBwAA"
1975*795d594fSAndroid Build Coastguard Worker   "8AcAAA0IAAAyCAAAUwgAAHwIAACeCAAAvQgAANcIAADpCAAA7AgAAPgIAAD7CAAAAAkAAAYJAAAM"
1976*795d594fSAndroid Build Coastguard Worker   "CQAAEAkAABUJAAAaCQAAHgkAACMJAAAnCQAAKgkAADMJAABICQAATQkAAFwJAABqCQAAdgkAAIQJ"
1977*795d594fSAndroid Build Coastguard Worker   "AACPCQAAmgkAAKYJAACzCQAAygkAANkJAADoCQAA9AkAAAAKAAAKCgAAHgoAACQKAAAyCgAAPQoA"
1978*795d594fSAndroid Build Coastguard Worker   "AEUKAABLCgAAYgoAAGgKAABtCgAAdgoAAIIKAACOCgAAmwoAAKEKAAADAAAABAAAAAUAAAAGAAAA"
1979*795d594fSAndroid Build Coastguard Worker   "CAAAAAsAAAAPAAAAEAAAABEAAAASAAAAEwAAABQAAAAVAAAAFgAAABgAAAAZAAAAGgAAABsAAAAc"
1980*795d594fSAndroid Build Coastguard Worker   "AAAAHQAAAB4AAAAfAAAAIAAAACEAAAAiAAAAIwAAACQAAAAlAAAAJwAAADEAAAAzAAAACQAAAAQA"
1981*795d594fSAndroid Build Coastguard Worker   "AABMBQAADgAAABMAAABUBQAADQAAABUAAAB0BQAADAAAABYAAAAAAAAAJwAAABwAAAAAAAAAKAAA"
1982*795d594fSAndroid Build Coastguard Worker   "ABwAAACABQAAKQAAABwAAACIBQAAKgAAABwAAACUBQAAKwAAABwAAACgBQAALAAAABwAAABMBQAA"
1983*795d594fSAndroid Build Coastguard Worker   "LQAAABwAAACoBQAALwAAABwAAACwBQAALwAAABwAAAC4BQAALgAAABwAAADABQAAMAAAABwAAADI"
1984*795d594fSAndroid Build Coastguard Worker   "BQAALgAAABwAAADQBQAACQAJAAoAAAAKABMAPwAAABEADQBLAAAACgAEAAIAAAAKAAAANAAAAAoA"
1985*795d594fSAndroid Build Coastguard Worker   "AQBFAAAACgAPAEgAAAAKAAQAUAAAAA0ACABMAAAADwAEAAIAAAAUAA0AAgAAABYAAgBAAAAAFwAD"
1986*795d594fSAndroid Build Coastguard Worker   "AEcAAAAZAAUANgAAABkABgA2AAAAGQAHADYAAAAZAAkANgAAABkACgA2AAAAGQALADYAAAAZAAwA"
1987*795d594fSAndroid Build Coastguard Worker   "NgAAABkADgA3AAAAnQsAAJ0LAAAKAAAAAQAAAA8AAAAAAAAAJgAAACQFAADGCwAAAAAAAAQAAAAC"
1988*795d594fSAndroid Build Coastguard Worker   "AAAAAQAAAN4KAAACAAAAegsAAJILAAACAAAAkgsAAJoLAAABAAEAAQAAAKgKAAAEAAAAcBAGAAAA"
1989*795d594fSAndroid Build Coastguard Worker   "DgADAAIAAAAAAK0KAAADAAAAkAABAg8AAAAYAA8ABgAAALQKAABTAAAAcRARAAwAEhJxIA0A0gAT"
1990*795d594fSAndroid Build Coastguard Worker   "AmEAcSAKAOIAEwIABHEgDQDyABISAgAQAHEgDQACABICFAOamTFBAgARAHEwDAADAhYGAAAYApqZ"
1991*795d594fSAndroid Build Coastguard Worker   "mZmZmQFABQQSAHcGCwACABsCBwAAAAgAFABxIBAAAgAcAgoACAAVAHEgDwACABcCFc1bBwUAFgBx"
1992*795d594fSAndroid Build Coastguard Worker   "QA4AMhBxAAkAAAAMAhwDCgBuQAgAMroMAiIDFABwIAcAIwARAwAABAABAAIAAADRCgAADAAAAGIA"
1993*795d594fSAndroid Build Coastguard Worker   "AgASIRIy/CAAACEACgFuIAUAEAAOAAMAAQACAAAA2AoAAAsAAAASIBIx/CABABAACgASUXEgDQAB"
1994*795d594fSAndroid Build Coastguard Worker   "AA4AAAAAAAAAAAAAAAMAAAAAAAAAAQAAAMwDAAACAAAA1AMAAAQAAADgAwAAAgAAAAQABAANAAAA"
1995*795d594fSAndroid Build Coastguard Worker   "FgAQABgAHQAAAAEAGwAEAAMAAgAQAA4ABQAAAAMAAAAOABAAGAAAAAIAAAABAAEAAwAAAAIAAgAC"
1996*795d594fSAndroid Build Coastguard Worker   "AAAAAwAAAAMAAwADAAAAAQAAAAQAAAACAAAABQAFAAIAAAAPAA8AAgAAABAAEAABAAAAFQAAAAEA"
1997*795d594fSAndroid Build Coastguard Worker   "AAAdAAAAAQAAAB4AASgABjwqPjtKKQAGPGluaXQ+AAFCAAFDAAFEAAFGAAVIZWxsbwABSQADSUlJ"
1998*795d594fSAndroid Build Coastguard Worker   "AA1JTlZPS0VfU1RBVElDAAFKAAFMAARMTExMAA5MTExMWkJDU0lGRExMSgAzTGNvbS9hbmRyb2lk"
1999*795d594fSAndroid Build Coastguard Worker   "L2phY2svYW5ub3RhdGlvbnMvQ2FsbGVkQnlJbnZva2VDdXN0b207ACdMY29tL2FuZHJvaWQvamFj"
2000*795d594fSAndroid Build Coastguard Worker   "ay9hbm5vdGF0aW9ucy9Db25zdGFudDsAMUxjb20vYW5kcm9pZC9qYWNrL2Fubm90YXRpb25zL0xp"
2001*795d594fSAndroid Build Coastguard Worker   "bmtlck1ldGhvZEhhbmRsZTsAL0xjb20vYW5kcm9pZC9qYWNrL2Fubm90YXRpb25zL01ldGhvZEhh"
2002*795d594fSAndroid Build Coastguard Worker   "bmRsZUtpbmQ7ADNMY29tL2FuZHJvaWQvamFjay9qYXZhNy9pbnZva2VjdXN0b20vdGVzdDAwNC9U"
2003*795d594fSAndroid Build Coastguard Worker   "ZXN0czsAHUxkYWx2aWsvYW5ub3RhdGlvbi9TaWduYXR1cmU7ABpMZGFsdmlrL2Fubm90YXRpb24v"
2004*795d594fSAndroid Build Coastguard Worker   "VGhyb3dzOwAVTGphdmEvaW8vUHJpbnRTdHJlYW07ABBMamF2YS9sYW5nL0NsYXNzABFMamF2YS9s"
2005*795d594fSAndroid Build Coastguard Worker   "YW5nL0NsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAEkxqYXZh"
2006*795d594fSAndroid Build Coastguard Worker   "L2xhbmcvU3lzdGVtOwAVTGphdmEvbGFuZy9UaHJvd2FibGU7ABtMamF2YS9sYW5nL2ludm9rZS9D"
2007*795d594fSAndroid Build Coastguard Worker   "YWxsU2l0ZTsAI0xqYXZhL2xhbmcvaW52b2tlL0NvbnN0YW50Q2FsbFNpdGU7AB9MamF2YS9sYW5n"
2008*795d594fSAndroid Build Coastguard Worker   "L2ludm9rZS9NZXRob2RIYW5kbGU7ACdMamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGVzJExv"
2009*795d594fSAndroid Build Coastguard Worker   "b2t1cDsAIExqYXZhL2xhbmcvaW52b2tlL01ldGhvZEhhbmRsZXM7AB1MamF2YS9sYW5nL2ludm9r"
2010*795d594fSAndroid Build Coastguard Worker   "ZS9NZXRob2RUeXBlOwAYTGp1bml0L2ZyYW1ld29yay9Bc3NlcnQ7ABBMb3JnL2p1bml0L1Rlc3Q7"
2011*795d594fSAndroid Build Coastguard Worker   "AAFTAApUZXN0cy5qYXZhAAFWAANWQ0MABFZEREQABFZGRkYAAlZJAANWSUkAA1ZKSgACVkwAA1ZM"
2012*795d594fSAndroid Build Coastguard Worker   "TAACVloAAVoAB1pCQ1NJRkQAE1tMamF2YS9sYW5nL1N0cmluZzsAA2FkZAANYXJndW1lbnRUeXBl"
2013*795d594fSAndroid Build Coastguard Worker   "cwAMYXNzZXJ0RXF1YWxzAAphc3NlcnRUcnVlAAxib29sZWFuVmFsdWUACWJ5dGVWYWx1ZQAJY2hh"
2014*795d594fSAndroid Build Coastguard Worker   "clZhbHVlAApjbGFzc1ZhbHVlAAtkb3VibGVWYWx1ZQAVZW1pdHRlcjogamFjay00LjAtZW5nAA1l"
2015*795d594fSAndroid Build Coastguard Worker   "bmNsb3NpbmdUeXBlAA1maWVsZENhbGxTaXRlAApmaW5kU3RhdGljAApmbG9hdFZhbHVlAAhpbnRW"
2016*795d594fSAndroid Build Coastguard Worker   "YWx1ZQASaW52b2tlTWV0aG9kSGFuZGxlAARraW5kAAxsaW5rZXJNZXRob2QACWxvbmdWYWx1ZQAG"
2017*795d594fSAndroid Build Coastguard Worker   "bG9va3VwAARtYWluABVtZXRob2RIYW5kbGVFeHRyYUFyZ3MABG5hbWUAA291dAAHcHJpbnRsbgAK"
2018*795d594fSAndroid Build Coastguard Worker   "cmV0dXJuVHlwZQAKc2hvcnRWYWx1ZQALc3RyaW5nVmFsdWUABHRlc3QABXZhbHVlACMABw4ANwIA"
2019*795d594fSAndroid Build Coastguard Worker   "AAcOAD4NAAAAAAAAAAAAAAAAAAcOPEtaWmmWw4d4h6UAUgEABw60AE4ABw6lAAAGBTUcAhgEGARD"
2020*795d594fSAndroid Build Coastguard Worker   "HAEdCAQ1HA0YFhgQGBgYHRgAGAEYGxgEGAMYAhgQGA4YBT4YCkQbAEoXRUkcCh0HATgcAT8dBwE5"
2021*795d594fSAndroid Build Coastguard Worker   "HAEAAR0HATocAQNhHQcBThwBIgAEHQcBQhwBBAEdBwFBHAFwmpkxQR0HATwcAfGamZmZmZkBQB0H"
2022*795d594fSAndroid Build Coastguard Worker   "AU8cARcHHQcBOxwBGAodBwFGHAFmFc1bB0oXNE0YBAILAVEcCRcAFyAXGhciFzIXGhcXFwEXHQIM"
2023*795d594fSAndroid Build Coastguard Worker   "AVEcARgSARoADRYAFzQVAAQBBAEEYSQABAQBcJqZMUHxmpmZmZmZAUAXBxgKZhXNWwcBAAQBAQkA"
2024*795d594fSAndroid Build Coastguard Worker   "gYAE7AcBCoQIAQqcCAEJ1AkEAfwJAAATAAAAAAAAAAEAAAAAAAAAAQAAAFIAAABwAAAAAgAAAB8A"
2025*795d594fSAndroid Build Coastguard Worker   "AAC4AQAAAwAAABAAAAA0AgAABAAAAAMAAAD0AgAABQAAABIAAAAMAwAABwAAAAIAAACcAwAABgAA"
2026*795d594fSAndroid Build Coastguard Worker   "AAEAAACkAwAACAAAAAEAAADEAwAAAxAAAAMAAADMAwAAASAAAAUAAADsAwAABiAAAAEAAAAkBQAA"
2027*795d594fSAndroid Build Coastguard Worker   "ARAAAA0AAABMBQAAAiAAAFIAAADWBQAAAyAAAAUAAACoCgAABCAAAAQAAADeCgAABSAAAAEAAACd"
2028*795d594fSAndroid Build Coastguard Worker   "CwAAACAAAAEAAADGCwAAABAAAAEAAADkCwAA"
2029*795d594fSAndroid Build Coastguard Worker };
2030*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,InvokeCustomDexSamples)2031*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, InvokeCustomDexSamples) {
2032*795d594fSAndroid Build Coastguard Worker   for (size_t i = 0; i < arraysize(kInvokeCustomDexFiles); ++i) {
2033*795d594fSAndroid Build Coastguard Worker     size_t length;
2034*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kInvokeCustomDexFiles[i], &length));
2035*795d594fSAndroid Build Coastguard Worker     CHECK(dex_bytes != nullptr);
2036*795d594fSAndroid Build Coastguard Worker     // Note: `dex_file` will be destroyed before `dex_bytes`.
2037*795d594fSAndroid Build Coastguard Worker     std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
2038*795d594fSAndroid Build Coastguard Worker     std::string error_msg;
2039*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(dex::Verify(dex_file.get(),
2040*795d594fSAndroid Build Coastguard Worker                             "good checksum, verify",
2041*795d594fSAndroid Build Coastguard Worker                             /*verify_checksum=*/true,
2042*795d594fSAndroid Build Coastguard Worker                             &error_msg));
2043*795d594fSAndroid Build Coastguard Worker     // TODO(oth): Test corruptions (b/35308502)
2044*795d594fSAndroid Build Coastguard Worker   }
2045*795d594fSAndroid Build Coastguard Worker }
2046*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,BadStaticFieldInitialValuesArray)2047*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, BadStaticFieldInitialValuesArray) {
2048*795d594fSAndroid Build Coastguard Worker   // Generated DEX file version (037) from:
2049*795d594fSAndroid Build Coastguard Worker   //
2050*795d594fSAndroid Build Coastguard Worker   // .class public LBadStaticFieldInitialValuesArray;
2051*795d594fSAndroid Build Coastguard Worker   // .super Ljava/lang/Object;
2052*795d594fSAndroid Build Coastguard Worker   //
2053*795d594fSAndroid Build Coastguard Worker   //  # static fields
2054*795d594fSAndroid Build Coastguard Worker   //  .field static final c:C = 'c'
2055*795d594fSAndroid Build Coastguard Worker   //  .field static final i:I = 0x1
2056*795d594fSAndroid Build Coastguard Worker   //  .field static final s:Ljava/lang/String; = "s"
2057*795d594fSAndroid Build Coastguard Worker   //
2058*795d594fSAndroid Build Coastguard Worker   //  # direct methods
2059*795d594fSAndroid Build Coastguard Worker   //  .method public constructor <init>()V
2060*795d594fSAndroid Build Coastguard Worker   //      .registers 1
2061*795d594fSAndroid Build Coastguard Worker   //      invoke-direct {p0}, Ljava/lang/Object;-><init>()V
2062*795d594fSAndroid Build Coastguard Worker   //      return-void
2063*795d594fSAndroid Build Coastguard Worker   //  .end method
2064*795d594fSAndroid Build Coastguard Worker   //
2065*795d594fSAndroid Build Coastguard Worker   // Output file was hex edited so that static field "i" has string typing in initial values array.
2066*795d594fSAndroid Build Coastguard Worker   static const char kDexBase64[] =
2067*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNQBrMi4cCPcMvvXNRw0uI6RRubwMPwgEYXIsAgAAcAAAAHhWNBIAAAAAAAAAAIwBAAAL"
2068*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAAYAAACcAAAAAQAAALQAAAADAAAAwAAAAAIAAADYAAAAAQAAAOgAAAAkAQAACAEAACAB"
2069*795d594fSAndroid Build Coastguard Worker       "AAAoAQAAMAEAADMBAAA2AQAAOwEAAE8BAABjAQAAZgEAAGkBAABsAQAAAgAAAAMAAAAEAAAABQAA"
2070*795d594fSAndroid Build Coastguard Worker       "AAYAAAAHAAAABwAAAAUAAAAAAAAAAgAAAAgAAAACAAEACQAAAAIABAAKAAAAAgAAAAAAAAADAAAA"
2071*795d594fSAndroid Build Coastguard Worker       "AAAAAAIAAAABAAAAAwAAAAAAAAABAAAAAAAAAHsBAAB0AQAAAQABAAEAAABvAQAABAAAAHAQAQAA"
2072*795d594fSAndroid Build Coastguard Worker       "AA4ABjxpbml0PgAGQS5qYXZhAAFDAAFJAANMQTsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEv"
2073*795d594fSAndroid Build Coastguard Worker       "bGFuZy9TdHJpbmc7AAFWAAFjAAFpAAFzAAEABw4AAwNjFwoXCgMAAQAAGAEYARgAgYAEiAIADQAA"
2074*795d594fSAndroid Build Coastguard Worker       "AAAAAAABAAAAAAAAAAEAAAALAAAAcAAAAAIAAAAGAAAAnAAAAAMAAAABAAAAtAAAAAQAAAADAAAA"
2075*795d594fSAndroid Build Coastguard Worker       "wAAAAAUAAAACAAAA2AAAAAYAAAABAAAA6AAAAAEgAAABAAAACAEAAAIgAAALAAAAIAEAAAMgAAAB"
2076*795d594fSAndroid Build Coastguard Worker       "AAAAbwEAAAUgAAABAAAAdAEAAAAgAAABAAAAewEAAAAQAAABAAAAjAEAAA==";
2077*795d594fSAndroid Build Coastguard Worker 
2078*795d594fSAndroid Build Coastguard Worker   size_t length;
2079*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kDexBase64, &length));
2080*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
2081*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
2082*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
2083*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
2084*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(dex::Verify(dex_file.get(),
2085*795d594fSAndroid Build Coastguard Worker                            "bad static field initial values array",
2086*795d594fSAndroid Build Coastguard Worker                            /*verify_checksum=*/true,
2087*795d594fSAndroid Build Coastguard Worker                            &error_msg));
2088*795d594fSAndroid Build Coastguard Worker }
2089*795d594fSAndroid Build Coastguard Worker 
TEST_F(DexFileVerifierTest,GoodStaticFieldInitialValuesArray)2090*795d594fSAndroid Build Coastguard Worker TEST_F(DexFileVerifierTest, GoodStaticFieldInitialValuesArray) {
2091*795d594fSAndroid Build Coastguard Worker   // Generated DEX file version (037) from:
2092*795d594fSAndroid Build Coastguard Worker   //
2093*795d594fSAndroid Build Coastguard Worker   //  .class public LGoodStaticFieldInitialValuesArray;
2094*795d594fSAndroid Build Coastguard Worker   //  .super Ljava/lang/Object;
2095*795d594fSAndroid Build Coastguard Worker   //
2096*795d594fSAndroid Build Coastguard Worker   //  # static fields
2097*795d594fSAndroid Build Coastguard Worker   //  .field static final b:B = 0x1t
2098*795d594fSAndroid Build Coastguard Worker   //  .field static final c:C = 'c'
2099*795d594fSAndroid Build Coastguard Worker   //  .field static final d:D = 0.6
2100*795d594fSAndroid Build Coastguard Worker   //  .field static final f:F = 0.5f
2101*795d594fSAndroid Build Coastguard Worker   //  .field static final i:I = 0x3
2102*795d594fSAndroid Build Coastguard Worker   //  .field static final j:J = 0x4L
2103*795d594fSAndroid Build Coastguard Worker   //  .field static final l1:Ljava/lang/String;
2104*795d594fSAndroid Build Coastguard Worker   //  .field static final l2:Ljava/lang/String; = "s"
2105*795d594fSAndroid Build Coastguard Worker   //  .field static final l3:Ljava/lang/Class; = Ljava/lang/String;
2106*795d594fSAndroid Build Coastguard Worker   //  .field static final s:S = 0x2s
2107*795d594fSAndroid Build Coastguard Worker   //  .field static final z:Z = true
2108*795d594fSAndroid Build Coastguard Worker   //
2109*795d594fSAndroid Build Coastguard Worker   //  # direct methods
2110*795d594fSAndroid Build Coastguard Worker   //  .method public constructor <init>()V
2111*795d594fSAndroid Build Coastguard Worker   //      .registers 1
2112*795d594fSAndroid Build Coastguard Worker   //      invoke-direct {p0}, Ljava/lang/Object;-><init>()V
2113*795d594fSAndroid Build Coastguard Worker   //      return-void
2114*795d594fSAndroid Build Coastguard Worker   //  .end method
2115*795d594fSAndroid Build Coastguard Worker   static const char kDexBase64[] =
2116*795d594fSAndroid Build Coastguard Worker       "ZGV4CjAzNQAwWxLbdhFa1NGiFWjsy5fhUCHxe5QHtPY8AwAAcAAAAHhWNBIAAAAAAAAAAJwCAAAZ"
2117*795d594fSAndroid Build Coastguard Worker       "AAAAcAAAAA0AAADUAAAAAQAAAAgBAAALAAAAFAEAAAIAAABsAQAAAQAAAHwBAACgAQAAnAEAAJwB"
2118*795d594fSAndroid Build Coastguard Worker       "AACkAQAApwEAAKoBAACtAQAAsAEAALMBAAC2AQAA2wEAAO4BAAACAgAAFgIAABkCAAAcAgAAHwIA"
2119*795d594fSAndroid Build Coastguard Worker       "ACICAAAlAgAAKAIAACsCAAAuAgAAMQIAADUCAAA5AgAAPQIAAEACAAABAAAAAgAAAAMAAAAEAAAA"
2120*795d594fSAndroid Build Coastguard Worker       "BQAAAAYAAAAHAAAACAAAAAkAAAAKAAAACwAAAAwAAAANAAAADAAAAAsAAAAAAAAABgAAAA4AAAAG"
2121*795d594fSAndroid Build Coastguard Worker       "AAEADwAAAAYAAgAQAAAABgADABEAAAAGAAQAEgAAAAYABQATAAAABgAJABQAAAAGAAkAFQAAAAYA"
2122*795d594fSAndroid Build Coastguard Worker       "BwAWAAAABgAKABcAAAAGAAwAGAAAAAYAAAAAAAAACAAAAAAAAAAGAAAAAQAAAAgAAAAAAAAA////"
2123*795d594fSAndroid Build Coastguard Worker       "/wAAAAB8AgAARAIAAAY8aW5pdD4AAUIAAUMAAUQAAUYAAUkAAUoAI0xHb29kU3RhdGljRmllbGRJ"
2124*795d594fSAndroid Build Coastguard Worker       "bml0aWFsVmFsdWVzQXJyYXk7ABFMamF2YS9sYW5nL0NsYXNzOwASTGphdmEvbGFuZy9PYmplY3Q7"
2125*795d594fSAndroid Build Coastguard Worker       "ABJMamF2YS9sYW5nL1N0cmluZzsAAVMAAVYAAVoAAWIAAWMAAWQAAWYAAWkAAWoAAmwxAAJsMgAC"
2126*795d594fSAndroid Build Coastguard Worker       "bDMAAXMAAXoAAAsAAQNj8TMzMzMzM+M/ED8EAwYEHhcXGAkCAj8AAAAAAQABAAEAAAAAAAAABAAA"
2127*795d594fSAndroid Build Coastguard Worker       "AHAQAQAAAA4ACwABAAAYARgBGAEYARgBGAEYARgBGAEYARgAgYAE5AQNAAAAAAAAAAEAAAAAAAAA"
2128*795d594fSAndroid Build Coastguard Worker       "AQAAABkAAABwAAAAAgAAAA0AAADUAAAAAwAAAAEAAAAIAQAABAAAAAsAAAAUAQAABQAAAAIAAABs"
2129*795d594fSAndroid Build Coastguard Worker       "AQAABgAAAAEAAAB8AQAAAiAAABkAAACcAQAABSAAAAEAAABEAgAAAxAAAAEAAABgAgAAASAAAAEA"
2130*795d594fSAndroid Build Coastguard Worker       "AABkAgAAACAAAAEAAAB8AgAAABAAAAEAAACcAgAA";
2131*795d594fSAndroid Build Coastguard Worker 
2132*795d594fSAndroid Build Coastguard Worker   size_t length;
2133*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<uint8_t[]> dex_bytes(DecodeBase64(kDexBase64, &length));
2134*795d594fSAndroid Build Coastguard Worker   CHECK(dex_bytes != nullptr);
2135*795d594fSAndroid Build Coastguard Worker   // Note: `dex_file` will be destroyed before `dex_bytes`.
2136*795d594fSAndroid Build Coastguard Worker   std::unique_ptr<DexFile> dex_file(GetDexFile(dex_bytes.get(), length));
2137*795d594fSAndroid Build Coastguard Worker   std::string error_msg;
2138*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(dex::Verify(dex_file.get(),
2139*795d594fSAndroid Build Coastguard Worker                           "good static field initial values array",
2140*795d594fSAndroid Build Coastguard Worker                           /*verify_checksum=*/true,
2141*795d594fSAndroid Build Coastguard Worker                           &error_msg));
2142*795d594fSAndroid Build Coastguard Worker }
2143*795d594fSAndroid Build Coastguard Worker 
2144*795d594fSAndroid Build Coastguard Worker }  // namespace art
2145