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