久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

<small id='3lO5n'></small><noframes id='3lO5n'>

    1. <legend id='3lO5n'><style id='3lO5n'><dir id='3lO5n'><q id='3lO5n'></q></dir></style></legend>
      <i id='3lO5n'><tr id='3lO5n'><dt id='3lO5n'><q id='3lO5n'><span id='3lO5n'><b id='3lO5n'><form id='3lO5n'><ins id='3lO5n'></ins><ul id='3lO5n'></ul><sub id='3lO5n'></sub></form><legend id='3lO5n'></legend><bdo id='3lO5n'><pre id='3lO5n'><center id='3lO5n'></center></pre></bdo></b><th id='3lO5n'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='3lO5n'><tfoot id='3lO5n'></tfoot><dl id='3lO5n'><fieldset id='3lO5n'></fieldset></dl></div>
    2. <tfoot id='3lO5n'></tfoot>
        <bdo id='3lO5n'></bdo><ul id='3lO5n'></ul>

        為什么我會(huì)得到 _CrtIsValidHeapPointer(block) 和/或 i

        Why do I get _CrtIsValidHeapPointer(block) and/or is_block_type_valid(header-gt;_block_use) assertions?(為什么我會(huì)得到 _CrtIsValidHeapPointer(block) 和/或 is_block_type_valid(header-_block_use) 斷言?) - IT屋-程序員軟件開發(fā)技

              <tbody id='2mVkR'></tbody>

            <i id='2mVkR'><tr id='2mVkR'><dt id='2mVkR'><q id='2mVkR'><span id='2mVkR'><b id='2mVkR'><form id='2mVkR'><ins id='2mVkR'></ins><ul id='2mVkR'></ul><sub id='2mVkR'></sub></form><legend id='2mVkR'></legend><bdo id='2mVkR'><pre id='2mVkR'><center id='2mVkR'></center></pre></bdo></b><th id='2mVkR'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='2mVkR'><tfoot id='2mVkR'></tfoot><dl id='2mVkR'><fieldset id='2mVkR'></fieldset></dl></div>

                <bdo id='2mVkR'></bdo><ul id='2mVkR'></ul>
              • <legend id='2mVkR'><style id='2mVkR'><dir id='2mVkR'><q id='2mVkR'></q></dir></style></legend>

                  <small id='2mVkR'></small><noframes id='2mVkR'>

                1. <tfoot id='2mVkR'></tfoot>
                  本文介紹了為什么我會(huì)得到 _CrtIsValidHeapPointer(block) 和/或 is_block_type_valid(header->_block_use) 斷言?的處理方法,對(duì)大家解決問題具有一定的參考價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧!

                  問題描述

                  限時(shí)送ChatGPT賬號(hào)..

                  當(dāng)我在調(diào)試模式下使用 VisualStudio 編譯程序運(yùn)行我的程序時(shí),有時(shí)我會(huì)得到

                  <塊引用>

                  調(diào)試斷言失??!表達(dá)式:_CrtIsValidHeapPointer(block)

                  <塊引用>

                  調(diào)試斷言失?。”磉_(dá)式:is_block_type_valid(header->_block_use)

                  (或兩個(gè)相繼)斷言.

                  什么意思?如何找到并修復(fù)此類問題的根源?

                  解決方案

                  這些斷言表明,應(yīng)該釋放的指針無效(或不再有效)(_CrtIsValidHeapPointer-assertion)或堆在程序運(yùn)行期間的某個(gè)時(shí)間點(diǎn)被破壞 (is_block_type_valid(header->_block_use)-assertion aka _Block_Type_Is_Valid (pHead->nBlockUse)-assertion在早期版本中).

                  從堆中獲取內(nèi)存時(shí),malloc/free 函數(shù)不直接與操作系統(tǒng)通信,而是與內(nèi)存管理器通信,通常由相應(yīng)的內(nèi)存管理器提供C-運(yùn)行時(shí).VisualStudio/Windows SDK 為調(diào)試構(gòu)建提供了一個(gè)特殊的堆內(nèi)存管理器,它在運(yùn)行時(shí)執(zhí)行額外的健全性檢查.

                  _CrtIsValidHeapPointer 只是一個(gè)啟發(fā)式,但是無效指針的情況已經(jīng)足夠多,這個(gè)函數(shù)可以報(bào)告問題.

                  1._CrtIsValidHeapPointer-斷言何時(shí)觸發(fā)?

                  有一些最常見的場(chǎng)景:

                  A.指針不指向從堆開始的內(nèi)存:

                  char *mem = 不在堆上!";免費(fèi)(內(nèi)存);

                  這里的文字沒有存儲(chǔ)在堆上,因此可以/不應(yīng)該被釋放.

                  B.指針的值不是malloc/calloc返回的原始地址:

                  unsigned char *mem = (unsigned char*)malloc(100);內(nèi)存++;免費(fèi)(內(nèi)存);//mem地址錯(cuò)誤!

                  由于 mem 的值在增量后不再是 64byte 對(duì)齊的,所以通過完整性檢查可以很容易地看出它不能是堆指針!

                  一個(gè)稍微復(fù)雜但并不罕見的 C++ 示例(不匹配 new[]delete):

                  struct A {int a = 0;~A() {//析構(gòu)函數(shù)不是微不足道的!std::cout <<<<
                  ";}};A *mem = 新 A[10];刪除內(nèi)存;

                  當(dāng)new A[n]被調(diào)用時(shí),實(shí)際上sizeof(size_t)+n*sizeof(A)字節(jié)內(nèi)存是通過malloc (當(dāng)A類的析構(gòu)函數(shù)不是平凡時(shí)),數(shù)組中元素的個(gè)數(shù)保存在分配內(nèi)存的開頭,返回的指針mem指向的不是到 malloc 返回的原始地址,但是到地址+偏移量 (sizeof(size_t)).然而,delete 對(duì)這個(gè)偏移量一無所知,并試圖刪除地址錯(cuò)誤的指針(delete [] 會(huì)做正確的事情).

                  C.雙重免費(fèi):

                  unsigned char *mem = (unsigned char*)malloc(10);免費(fèi)(內(nèi)存);免費(fèi)(內(nèi)存);# 指針已經(jīng)被釋放

                  C++ 中一個(gè)很常見的原因是 3 的規(guī)則/5 沒有得到遵守,例如:

                  struct A {//bad: 不遵守三規(guī)則int* ptr;A(int i): ptr(new int(i)){}~A() { 刪除指針;}};{A(0);a b = a;//a 和 b 共享指針:a.ptr == b.ptr}//這里 b 和 a 的析構(gòu)函數(shù)被調(diào)用 =>問題//首先 b.ptr 被刪除//刪除(已經(jīng)刪除)a.ptr 現(xiàn)在會(huì)導(dǎo)致 UB/error.

                  D.來自另一個(gè)運(yùn)行時(shí)/內(nèi)存管理器的指針

                  Windows 程序能夠同時(shí)使用多個(gè)運(yùn)行時(shí):每個(gè)使用的 dll 都可能有自己的運(yùn)行時(shí)/內(nèi)存管理器/堆,因?yàn)樗庆o態(tài)鏈接的,或者因?yàn)樗鼈冇胁煌陌姹?因此,在一個(gè) dll 中分配的內(nèi)存在另一個(gè) dll 中釋放時(shí)可能會(huì)失敗,該 dll 使用不同的堆(參見例如這個(gè) SO-question 或這個(gè) SO 問題).

                  2.is_block_type_valid(header->_block_use)-assertion 何時(shí)觸發(fā)?

                  在上述情況 A. 和 B. 中,另外 is_block_type_valid(header->_block_use) 也會(huì)觸發(fā).在 _CrtIsValidHeapPointer 斷言之后,free 函數(shù)(更精確的 free_dbg_nolock)在塊頭(由調(diào)試堆,稍后會(huì)提供更多信息)并檢查塊類型是否有效.但是,由于指針完全是偽造的,因此 nBlockUse 預(yù)期在內(nèi)存中的位置是一些隨機(jī)值.

                  但是,在某些情況下,當(dāng) is_block_type_valid(header->_block_use) 在沒有先前的 _CrtIsValidHeapPointer-assertion 的情況下觸發(fā)時(shí).

                  A._CrtIsValidHeapPointer 不檢測(cè)無效指針

                  這是一個(gè)例子:

                  unsigned char *mem = (unsigned char*)malloc(100);內(nèi)存+=64;免費(fèi)(內(nèi)存);

                  因?yàn)?debug-heap 用 0xCD 填充分配的內(nèi)存,我們可以肯定訪問 nBlockUse 會(huì)產(chǎn)生錯(cuò)誤的類型,從而導(dǎo)致上述斷言.>

                  B.堆損壞

                  大多數(shù)時(shí)候,當(dāng) is_block_type_valid(header->_block_use) 在沒有 _CrtIsValidHeapPointer 的情況下觸發(fā)時(shí),這意味著堆由于某些超出范圍而損壞寫.

                  所以如果我們精致"(并且不要覆蓋無人區(qū)"-稍后會(huì)詳細(xì)介紹):

                  unsigned char *mem = (unsigned char*)malloc(100);*(mem-17)=64;//顛簸 _block_use.免費(fèi)(內(nèi)存);

                  僅導(dǎo)致 is_block_type_valid(header->_block_use).


                  在上述所有情況下,可以通過跟蹤內(nèi)存分配來找到潛在的問題,但了解更多關(guān)于調(diào)試堆的結(jié)構(gòu)會(huì)有很大幫助.

                  可以找到有關(guān)調(diào)試堆的概述,例如在文檔中,或者所有的實(shí)現(xiàn)細(xì)節(jié)都可以在相應(yīng)的Windows Kit中找到,(例如C:Program Files (x86)Windows Kits10Source10.0.16299.0ucrtheapdebug_heap.cpp).

                  簡(jiǎn)而言之:當(dāng)在調(diào)試堆上分配內(nèi)存時(shí),分配的內(nèi)存比需要的多,因此無人區(qū)"之類的附加結(jié)構(gòu)將被分配.和附加信息,例如 _block_use,可以存儲(chǔ)在真實(shí)"旁邊.記憶.實(shí)際的內(nèi)存布局是:

                  -------------------------------------------------------------------------|區(qū)塊頭+無人區(qū)|真實(shí)"記憶|無人區(qū)| 高分辨率照片| CLIPARTO----------------------------------------------------------------------|32 字節(jié) + 4 字節(jié) |?字節(jié) |4 字節(jié) |-----------------------------------------------------------------

                  無人區(qū)"中的每一個(gè)字節(jié)在末尾和開頭設(shè)置為一個(gè)特殊值 (0xFD),因此一旦它被覆蓋,我們就可以注冊(cè)越界寫訪問(只要它們最多關(guān)閉 4 個(gè)字節(jié))).

                  比如在new[]-delete-mismatch的情況下,我們可以分析一下指針之前的內(nèi)存,看看這是否是無人區(qū)(這里作為代碼,但通常在調(diào)試器中完成):

                  A *mem = 新 A[10];...//代替//刪除內(nèi)存;//調(diào)查內(nèi)存:unsigned char* ch = reinterpret_cast(mem);for (int i = 0; i <16; i++) {std::cout <<(int)(*(ch - i)) <<"";}

                  我們得到:

                  0 0 0 0 0 0 0 0 10 253 253 253 253 0 0 52

                  即前 8 個(gè)字節(jié)用于元素?cái)?shù) (10),而不是我們看到的無人區(qū)".(0xFD=253) 然后是其他信息.很容易看出,出了什么問題 - 如果指針正確,前 4 個(gè)值在 253.

                  當(dāng)調(diào)試堆釋放內(nèi)存時(shí),它會(huì)用一個(gè)特殊的字節(jié)值覆蓋它:0xDD,即221.還可以通過設(shè)置標(biāo)志_CRTDBG_DELAY_FREE_MEM_DF來限制曾經(jīng)使用和釋放的內(nèi)存的重用,因此內(nèi)存不僅在free調(diào)用之后直接保持標(biāo)記,而且在整個(gè)運(yùn)行過程中保持標(biāo)記的程序.所以當(dāng)我們第二次嘗試釋放同一個(gè)指針時(shí),調(diào)試堆可以看到,內(nèi)存已經(jīng)被釋放一次并觸發(fā)斷言.

                  因此,通過分析指針周圍的值,也很容易看出問題是雙重釋放的:

                  unsigned char *mem = (unsigned char*)malloc(10);免費(fèi)(內(nèi)存);for (int i = 0; i <16; i++) {printf("%d", (int)(*(mem - i)));}免費(fèi)(內(nèi)存);//第二個(gè)空閑

                  印刷品

                  221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221

                  內(nèi)存,即內(nèi)存已經(jīng)被釋放一次.

                  關(guān)于檢測(cè)堆損壞:

                  無人區(qū)的目的是檢測(cè)超出范圍的寫入,但這僅適用于在任一方向關(guān)閉 4 個(gè)字節(jié),例如:

                  unsigned char *mem = (unsigned char*)malloc(100);*(mem-1)=64;//擊敗無人區(qū)免費(fèi)(內(nèi)存);

                  導(dǎo)致

                  檢測(cè)到堆損壞:在正常塊 (#13266) 之前 0x0000025C6CC21050.CRT 檢測(cè)到應(yīng)用程序在開始堆緩沖區(qū)之前寫入內(nèi)存.

                  查找堆損壞的一個(gè)好方法是使用 _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF)ASSERT(_CrtCheckMemory());(請(qǐng)參閱此 SO-post).但是,這有點(diǎn)間接 - 使用 gflags 的更直接方式,如本 SO-post<中所述/a>(gflags 需要大約 30 倍的內(nèi)存并且慢大約 10 倍,這并不罕見).


                  順便說一句,_CrtMemBlockHeader 的定義隨著時(shí)間的推移而改變,不再是 在線幫助,但是:

                  struct _CrtMemBlockHeader{_CrtMemBlockHeader* _block_header_next;_CrtMemBlockHeader* _block_header_prev;字符常量* _file_name;int_line_number;int_block_use;size_t _data_size;長(zhǎng)_request_number;無符號(hào)字符_gap [no_mans_land_size];//其次是://無符號(hào)字符 _data[_data_size];//unsigned char _another_gap[no_mans_land_size];};

                  When I run my with VisualStudio compiled programs in debug-mode, sometimes I get

                  Debug assertion failed! Expression: _CrtIsValidHeapPointer(block)

                  or

                  Debug assertion failed! Expression: is_block_type_valid(header->_block_use)

                  (or both after each other) assertions.

                  What does it mean? How can I find and fix the origin of such problems?

                  解決方案

                  These assertions show that either the pointer, which should be freed is not (or no longer) valid (_CrtIsValidHeapPointer-assertion) or that the heap was corrupted at some point during the run of the program (is_block_type_valid(header->_block_use)-assertion aka _Block_Type_Is_Valid (pHead->nBlockUse)-assertion in earlier versions).

                  When acquiring memory from the heap, functions malloc/free don't communicate directly with the OS, but with a memory manager, which is usually provided by the corresponding C-runtime. VisualStudio/Windows SDK provide a special heap-memory manager for debug-builds, which performs additional sanity checks during the run time.

                  _CrtIsValidHeapPointer is just a heuristic, but there are enough cases of invalid pointers, for which this function can report a problem.

                  1. When does _CrtIsValidHeapPointer-assertion fire?

                  There are some of the most usual scenarios:

                  A. Pointer doesn't point to a memory from the heap to begin with:

                  char *mem = "not on the heap!";
                  free(mem); 
                  

                  here the literal isn't stored on the heap and thus can/should not be freed.

                  B. The value of the pointer isn't the original address returned by malloc/calloc:

                  unsigned char *mem = (unsigned char*)malloc(100);
                  mem++;
                  free(mem); // mem has wrong address!
                  

                  As value of mem is no longer 64byte aligned after the increment, the sanity check can easily see that it cannot be a heap-pointer!

                  A slightly more complex, but not unusual C++-example (mismatch new[] and delete):

                  struct A {
                      int a = 0;
                      ~A() {// destructor is not trivial!
                           std::cout << a << "
                  ";
                      }
                  };
                  A *mem = new A[10];
                  delete mem;
                  

                  When new A[n] is called, actually sizeof(size_t)+n*sizeof(A)bytes memory are allocated via malloc (when the destructor of the class A is not trivial), the number of elements in array is saved at the beginning of the allocated memory and the returned pointer mem points not to the original address returned by malloc, but to address+offset (sizeof(size_t)). However, delete knows nothing about this offset and tries to delete the pointer with wrong address (delete [] would do the right thing).

                  C. double-free:

                  unsigned char *mem = (unsigned char*)malloc(10);
                  free(mem);
                  free(mem);  # the pointer is already freed
                  

                  A very common reason in C++ that rule of three/five isn't adhered to, e.g:

                  struct A {// bad: doesn't adhere to rule of three
                      int* ptr;
                      A(int i): ptr(new int(i)){}
                      ~A() { delete ptr; }
                  };
                  
                  {
                    A a(0);
                    A b = a; // a and b share pointer: a.ptr == b.ptr
                  } // here destructors of b and a called => problem
                  //  at first b.ptr gets deleted
                  //  deleting (already deleted) a.ptr leads now to UB/error.
                  

                  D. pointer from another runtime/memory manager

                  Windows programs have the ability to use multiple runtimes at once: every used dll could potentially have its own runtime/memory manager/heap, because it was linked statically or because they have different versions. Thus, a memory allocated in one dll, could fail when freed in another dll, which uses a different heap (see for example this SO-question or this SO-question).

                  2. When does is_block_type_valid(header->_block_use)-assertion fire?

                  In the above cases A. and B., in addition also is_block_type_valid(header->_block_use) will fire. After _CrtIsValidHeapPointer-assertion, the free-function (more precise free_dbg_nolock) looks for info in the block-header (a special data structure used by debug-heap, more information about it later on) and checks that the block type is valid. However, because the pointer is completely bogus, the place in the memory, where nBlockUse is expected to be, is some random value.

                  However, there are some scenarios, when is_block_type_valid(header->_block_use) fires without previous _CrtIsValidHeapPointer-assertion.

                  A. _CrtIsValidHeapPointer doesn't detect invalid pointer

                  Here is an example:

                  unsigned char *mem = (unsigned char*)malloc(100);
                  mem+=64;
                  free(mem);
                  

                  Because debug-heap fills the allocated memory with 0xCD, we can be sure that accessing nBlockUse will yield a wrong type, thus leading to the above assertion.

                  B. Corruption of the heap

                  Most of the time, when is_block_type_valid(header->_block_use) fires without _CrtIsValidHeapPointer it means, that the heap was corrupted due to some out-of-range writes.

                  So if we "delicate" (and don't overwrite "no man's land"-more on that later):

                  unsigned char *mem = (unsigned char*)malloc(100);
                  *(mem-17)=64; // thrashes _block_use.
                  free(mem);
                  

                  leads only to is_block_type_valid(header->_block_use).


                  In all above cases, it is possible to find the underlying issue by following memory allocations, but knowing more about the structure of debug-heap helps a lot.

                  An overview about debug-heap can be found e.g. in documentation, alternatively all details of the implementation can be found in the corresponding Windows Kit,(e.g. C:Program Files (x86)Windows Kits10Source10.0.16299.0ucrtheapdebug_heap.cpp).

                  In a nutshell: When a memory is allocated on a debug heap, more memory than needed is allocated, so additional structures such as "no man's land" and additional info, such as _block_use, can be stored next to the "real" memory. The actual memory layout is:

                  ------------------------------------------------------------------------
                  | header of the block + no man's land |  "real" memory | no man's land |
                  ----------------------------------------------------------------------
                  |    32 bytes         +      4bytes   |     ? bytes    |     4 bytes   |
                  ------------------------------------------------------------------------
                  

                  Every byte in "no man's land" at the end and at the beginning are set to a special value (0xFD), so once it is overwritten we can register out-of-bounds write access (as long as they are at most 4 bytes off).

                  For example in the case of new[]-delete-mismatch we can analyze memory before the pointer, to see whether this is no man's land or not (here as code, but normally done in debugger):

                  
                  A *mem = new A[10];
                  ...
                  // instead of
                  //delete mem;
                  // investigate memory:
                  unsigned char* ch = reinterpret_cast<unsigned char*>(mem);
                  for (int i = 0; i < 16; i++) {
                      std::cout << (int)(*(ch - i)) << " ";
                  }
                  

                  we get:

                  0 0 0 0 0 0 0 0 10 253 253 253 253 0 0 52
                  

                  i.e. the first 8 bytes are used for the number of elements (10), than we see "no man's land" (0xFD=253) and then other information. It is easy to see, what is going wrong - if the pointer where correct, the first 4 values where 253.

                  When Debug-heap frees memory it overwrites it with a special byte value: 0xDD, i.e. 221. One also can restrict the reuse of once used and freed memory by setting flag _CRTDBG_DELAY_FREE_MEM_DF, thus the memory stays marked not only directly after the free-call, but during the whole run of the program. So when we try to free the same pointer a second time, debug-heap can see, taht the memory was already freed once and fire the assertion.

                  Thus, it is also easy to see, that the problem is a double-free, by analyzing the values around pointer:

                  unsigned char *mem = (unsigned char*)malloc(10);
                  free(mem);
                  for (int i = 0; i < 16; i++) {
                      printf("%d ", (int)(*(mem - i)));
                  }
                  free(mem); //second free
                  

                  prints

                  221 221 221 221 221 221 221 221 221 221 221 221 221 221 221 221
                  

                  the memory, i.e. the memory was already freed once.

                  On the detection of heap-corruption:

                  The purpose of no-man's land is to detect out-of-range writes, this however works only for being off for 4 bytes in either direction, e.g.:

                  unsigned char *mem = (unsigned char*)malloc(100);
                  *(mem-1)=64; // thrashes no-man's land
                  free(mem);
                  

                  leads to

                  HEAP CORRUPTION DETECTED: before Normal block (#13266) at 0x0000025C6CC21050.
                  CRT detected that the application wrote to memory before start of heap buffer.
                  

                  A good way to find heap corruption is to use _CrtSetDbgFlag(_CRTDBG_CHECK_ALWAYS_DF) or ASSERT(_CrtCheckMemory());(see this SO-post). However, this is somewhat indirect - a more direct way it to use gflags as explained in this SO-post (it is not unusual that gflags needs about 30 times more memory and is about 10 times slower).


                  Btw, the definition of _CrtMemBlockHeader changed over the time and no longer the one shown in online-help, but:

                  struct _CrtMemBlockHeader
                  {
                      _CrtMemBlockHeader* _block_header_next;
                      _CrtMemBlockHeader* _block_header_prev;
                      char const*         _file_name;
                      int                 _line_number;
                      
                      int                 _block_use;
                      size_t              _data_size;
                      
                      long                _request_number;
                      unsigned char       _gap[no_mans_land_size];
                  
                      // Followed by:
                      // unsigned char    _data[_data_size];
                      // unsigned char    _another_gap[no_mans_land_size];
                  };
                  

                  這篇關(guān)于為什么我會(huì)得到 _CrtIsValidHeapPointer(block) 和/或 is_block_type_valid(header->_block_use) 斷言?的文章就介紹到這了,希望我們推薦的答案對(duì)大家有所幫助,也希望大家多多支持html5模板網(wǎng)!

                  【網(wǎng)站聲明】本站部分內(nèi)容來源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

                  相關(guān)文檔推薦

                  Why do two functions have the same address?(為什么兩個(gè)函數(shù)的地址相同?)
                  Why the initializer of std::function has to be CopyConstructible?(為什么 std::function 的初始化程序必須是可復(fù)制構(gòu)造的?)
                  mixing templates with polymorphism(混合模板與多態(tài)性)
                  When should I use the keyword quot;typenamequot; when using templates(我什么時(shí)候應(yīng)該使用關(guān)鍵字“typename?使用模板時(shí))
                  Dependent name resolution amp; namespace std / Standard Library(依賴名稱解析命名空間 std/標(biāo)準(zhǔn)庫)
                  gcc can compile a variadic template while clang cannot(gcc 可以編譯可變參數(shù)模板,而 clang 不能)
                2. <small id='5QMcR'></small><noframes id='5QMcR'>

                  <i id='5QMcR'><tr id='5QMcR'><dt id='5QMcR'><q id='5QMcR'><span id='5QMcR'><b id='5QMcR'><form id='5QMcR'><ins id='5QMcR'></ins><ul id='5QMcR'></ul><sub id='5QMcR'></sub></form><legend id='5QMcR'></legend><bdo id='5QMcR'><pre id='5QMcR'><center id='5QMcR'></center></pre></bdo></b><th id='5QMcR'></th></span></q></dt></tr></i><div class="qwawimqqmiuu" id='5QMcR'><tfoot id='5QMcR'></tfoot><dl id='5QMcR'><fieldset id='5QMcR'></fieldset></dl></div>
                  <legend id='5QMcR'><style id='5QMcR'><dir id='5QMcR'><q id='5QMcR'></q></dir></style></legend>
                    <tbody id='5QMcR'></tbody>
                            <bdo id='5QMcR'></bdo><ul id='5QMcR'></ul>
                            <tfoot id='5QMcR'></tfoot>
                          • 主站蜘蛛池模板: 视频一区二区中文字幕 | 巨大黑人极品videos精品 | 国产精品日日做人人爱 | 免费在线一区二区 | 欧美一区二区三 | 韩日视频在线观看 | 欧美一区2区三区4区公司 | aaa精品 | 福利国产 | 在线免费国产 | 美女视频久久 | 国产在线拍偷自揄拍视频 | 精品中文字幕一区二区 | 久久久久成人精品亚洲国产 | 在线欧美亚洲 | 日本成人二区 | 香蕉视频91 | 日韩av在线免费 | 国产 欧美 日韩 一区 | 亚洲日韩中文字幕一区 | 国产午夜精品一区二区三区四区 | 欧美11一13sex性hd | 青春草在线 | 久久91精品国产一区二区三区 | 日本黄色大片免费 | 亚洲激情综合 | 天天综合永久入口 | 久久精品91久久久久久再现 | av网站免费在线观看 | 国产伦一区二区三区久久 | 国产精品久久久久久久久久久久久 | 精品蜜桃一区二区三区 | 午夜资源| 婷婷精品 | 国产一级视频在线播放 | 青青草国产在线观看 | 久草精品在线 | 精品国产视频在线观看 | 久久精品视频在线观看 | 91精品国产乱码久久久久久久久 | 视频在线一区二区 |