青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數據加載中……

使用gdb跟蹤C語言中變長數組的實現

 項目的代碼中出現的一個問題,問題的表現是,在一個函數中使用到了變長數組,而對超過這個數組 范圍的一個賦值,導致了數組首地址為空.

我把這個問題抽出來形成了一個示例函數,在i386下也出現類似的問題,代碼如下:

#include <stdio.h>

int test(int n)
{
    
char *arg[n + 4];

    printf(
"before:arg = %p\n"&arg[0]);
    arg[
16= NULL;
    printf(
"after:arg = %p\n"&arg[0]);

    
return 0;
}

int main()
{
    test(
2);

    
return 0;
}

這段代碼在i386平臺下面,執行完"arg[16] = NULL"語句之后,再打印arg的首地址,顯示為NULL
使用gdb跟蹤這個問題:
(gdb) b test
Breakpoint 1 at 0x804835b: file test.c, line 4.
(gdb) display /i $pc
(gdb) run
Starting program: /home/lichuang/test/a.out

Breakpoint 1, test (n=2) at test.c:4
4    {
1: x/i $pc  0x804835b <test+7>:    mov    %esp,%eax
(gdb) si
0x0804835d    4    {
1: x/i $pc  0x804835d <test+9>:    mov    %eax,%ebx
(gdb)
5        char *arg[n + 4];
1: x/i $pc  0x804835f <test+11>:    mov    0x8(%ebp),%eax
(gdb)
0x08048362    5        char *arg[n + 4];
1: x/i $pc  0x8048362 <test+14>:    add    $0x4,%eax
(gdb)
0x08048365    5        char *arg[n + 4];
1: x/i $pc  0x8048365 <test+17>:    shl    $0x2,%eax
(gdb)
0x08048368    5        char *arg[n + 4];
1: x/i $pc  0x8048368 <test+20>:    add    $0xf,%eax
(gdb)
0x0804836b    5        char *arg[n + 4];
1: x/i $pc  0x804836b <test+23>:    add    $0xf,%eax
(gdb)
0x0804836e    5        char *arg[n + 4];
1: x/i $pc  0x804836e <test+26>:    shr    $0x4,%eax
(gdb)
0x08048371    5        char *arg[n + 4];
1: x/i $pc  0x8048371 <test+29>:    shl    $0x4,%eax
(gdb)
0x08048374    5        char *arg[n + 4];
1: x/i $pc  0x8048374 <test+32>:    sub    %eax,%esp
(gdb)
0x08048376    5        char *arg[n + 4];
1: x/i $pc  0x8048376 <test+34>:    lea    0x8(%esp),%eax
(gdb)
0x0804837a    5        char *arg[n + 4];
1: x/i $pc  0x804837a <test+38>:    mov    %eax,0xffffffe8(%ebp)
(gdb)
0x0804837d    5        char *arg[n + 4];
1: x/i $pc  0x804837d <test+41>:    mov    0xffffffe8(%ebp),%eax
(gdb)
0x08048380    5        char *arg[n + 4];
1: x/i $pc  0x8048380 <test+44>:    add    $0xf,%eax
(gdb)
0x08048383    5        char *arg[n + 4];
1: x/i $pc  0x8048383 <test+47>:    shr    $0x4,%eax
(gdb)
0x08048386    5        char *arg[n + 4];
1: x/i $pc  0x8048386 <test+50>:    shl    $0x4,%eax
(gdb)
0x08048389    5        char *arg[n + 4];
1: x/i $pc  0x8048389 <test+53>:    mov    %eax,0xffffffe8(%ebp)
(gdb)
0x0804838c    5        char *arg[n + 4];
1: x/i $pc  0x804838c <test+56>:    mov    0xffffffe8(%ebp),%eax
(gdb)
0x0804838f    5        char *arg[n + 4];
1: x/i $pc  0x804838f <test+59>:    mov    %eax,0xfffffff8(%ebp)
(gdb)
7        printf("before:arg = %p\n", &arg[0]);
1: x/i $pc  0x8048392 <test+62>:    mov    0xfffffff8(%ebp),%eax


上面是使用gdb跟蹤匯編代碼顯示的結果,可以看到,在定義變長數組arg[n + 4]的時候,執行了很多語句,秘密都在這些匯編代碼里面了,把這個程序用objdump -d命令反匯編出來,抽出上面的那部分匯編代碼查看:
804835b:    89 e0                    mov    %esp,%eax
804835d:    
89 c3                    mov    %eax,%ebx
804835f:    8b 
45 08                 mov    0x8(%ebp),%eax
8048362:    83 c0 04                 add    $0x4,%eax
8048365:    c1 e0 02                 shl    $0x2,%eax
8048368:    83 c0 0f                 add    $0xf,%eax
804836b:    
83 c0 0f                 add    $0xf,%eax
804836e:    c1 e8 
04                 shr    $0x4,%eax
8048371:    c1 e0 04                 shl    $0x4,%eax
8048374:    29 c4                    sub    %eax,%esp
8048376:    8d 44 24 08              lea    0x8(%esp),%eax
804837a:    
89 45 e8                 mov    %eax,0xffffffe8(%ebp)
804837d:    8b 
45 e8                 mov    0xffffffe8(%ebp),%eax
8048380:    83 c0 0f                 add    $0xf,%eax
8048383:    c1 e8 04                 shr    $0x4,%eax
8048386:    c1 e0 04                 shl    $0x4,%eax
8048389:    89 45 e8                 mov    %eax,0xffffffe8(%ebp)
804838c:    8b 
45 e8                 mov    0xffffffe8(%ebp),%eax
804838f:    
89 45 f8                 mov    %eax,0xfffffff8(%ebp)
8048392:    8b 45 f8                 mov    0xfffffff8(%ebp),%eax

逐句進行分析如下:

804835b:    89 e0                    mov    %esp,%eax
804835d:    
89 c3                    mov    %eax,%ebx
將esp寄存器地址通過eax保存到ebx寄存器中


804835f:    8b 45 08                 mov    0x8(%ebp),%eax
8048362:    83 c0 04                 add    $0x4,%eax
首先獲得傳入test函數的參數n的值(在內存地址為ebp+8的位置),再將它的值加上4,也就得到了數組arg[n+4]的元素數量


8048365:    c1 e0 02                 shl    $0x2,%eax
8048368:    83 c0 0f                 add    $0xf,%eax
804836b:    
83 c0 0f                 add    $0xf,%eax
804836e:    c1 e8 
04                 shr    $0x4,%eax
8048371:    c1 e0 04                 shl    $0x4,%eax
首先將前面得到的元素數量左移兩位(shl 0x2),也就是乘以4,4是sizeof(char*)的大小,于是得到了char* arg[n+4]所容納元素的空間大小.之后兩次加上0xf,然后又右移4位左移4位的原因是,編譯器要將這個大小按照16來對齊,而又要留夠足夠的空 間,所以前面兩次加上0xf.在上面幾個操作完成之后,eax里面的值就是可以容納char* arg[n+4]的按照16對齊的數據

8048374:    29 c4                    sub    %eax,%esp
根據前面得到的eax值調整esp指針,也就是在test函數的棧幀地址的低位置留出了足夠容納arg數組的空間. 注意到,esp值已經在最開始保存到ebx寄存器中了,所以,在test函數的結束位置,還要使用ebx寄存器恢復esp寄存器.

8048376:    8d 44 24 08              lea    0x8(%esp),%eax
804837a:    
89 45 e8                 mov    %eax,0xffffffe8(%ebp)
804837d:    8b 
45 e8                 mov    0xffffffe8(%ebp),%eax
8048380:    83 c0 0f                 add    $0xf,%eax
8048383:    c1 e8 04                 shr    $0x4,%eax
8048386:    c1 e0 04                 shl    $0x4,%eax
8048389:    89 45 e8                 mov    %eax,0xffffffe8(%ebp)
804838c:    8b 
45 e8                 mov    0xffffffe8(%ebp),%eax
804838f:    
89 45 f8                 mov    %eax,0xfffffff8(%ebp)
第一句將地址esp+8賦值到eax中(注意lea指令和mov的區別,前者是取指針操作,后者是取指針所指向的內存數據操作),然后將eax賦值到 ebp+0xffffffe8內存處,而后面一句又將這個值賦值回到eax中,我不明白這句話有什么作用,看上去沒有什么影響.最后又執行前面看到的按照 16對齊的操作,對齊后的結果仍然保存在eax中.這個值就是最后arg的首地址所在,最后三句將這個值分別存放到ebp+0xffffffe8和 ebo+0xffffff8處.也就是說,arg的真實地址,其實在內存中有兩處進行了保存.在gdb中查看,確實如此:
(gdb) x/20 &arg
0xbfde96e0:    0x00000000    0x00000000    0x00000000    0x00000000
0xbfde96f0:    0x00000000    0x00000000    0x00000000    0x080482e0
0xbfde9700:    0x00000000    0x080495d8    0xbfde9718    0x08048265
0xbfde9710:    0xbfde96e0    0x00632214    0xbfde9748    0x08048429
0xbfde9720:    0xbfde96e0    0x00633ff4    0xbfde9738    0x080483eb
可以看到,查看&arg的內存地址后發現,它的地址是0xbfde96e0,而在地址為0xbfde9710和0xbfde9720,都存放著地 址&arg的地址0xbde96e0,它們分別位于&arg[13]和&arg[16]處,而這兩處的賦值,就是前面:
8048389:    89 45 e8                 mov    %eax,0xffffffe8(%ebp)
804838c:    8b 
45 e8                 mov    0xffffffe8(%ebp),%eax
804838f:    
89 45 f8                 mov    %eax,0xfffffff8(%ebp)
的結果.我不清楚為什么會在兩個地方保存這個地址. 所以,在test函數的代碼中,將arg[16]賦值為NULL之后,再次打印arg的值就是NULL了.

現在,可以得出以下的結論:

變長數組在實現時實際上退化為了指針,原先定長的數組,它的地址同時也就是容納數組元素位置的首地址,而變長數組,退化為了指針,該指針指向的位置才是真 正容納數組元素的首地址.在對匯編代碼的分析中,可以看到,在定義變長數組arg的時候,首先通過函數參數,以及數組元素的尺寸 (sizeof(char*))獲得這個數組的總大小(需要對齊),然后調整esp指針留出空間給數組.這就是因為變長數組的大小只有在運行時才確定,所 以需要在運行時動態計算并且在函數棧幀的最低位置留出空間.

大概的示意圖如下:


BTW:在gdb中,打印&arg可以看到:

(gdb) print &arg
$
1 = (char *(*)[0]) 0xbfde96e0

也就是,arg是一個指針,指向的是一個元素類型為char*的數組,而這個數組的元素是0.這是C中常用的技巧了,定義一個0元素的數組,實際上里面存放的元素數量是不確定的.這也證明了我們前面提到的:變長數組被編譯器退化為指針來處理.


最后,注意前面的描述都在i386平臺下面,根據編譯器,體系結構的不同,可能稍有區別,即使在同一個平臺下面,加不同的優化參數(如-O2等),具體的實現可能有差異,但是大體上還是上面提到的原理.

我想,從這個例子里,也可以進一步加深對指針和數組區別的理解.

posted on 2009-10-31 10:25 那誰 閱讀(7004) 評論(4)  編輯 收藏 引用 所屬分類: gdb

評論

# re: 使用gdb跟蹤C語言中變長數組的實現  回復  更多評論   

學習中
2009-10-31 11:07 | 尋舟

# re: 使用gdb跟蹤C語言中變長數組的實現  回復  更多評論   

感謝提供詳細的asm分析,但是看了你這篇文章后,我還是沒有明白為什么要在arg[16]的位置保存了arg[0]的地址,另外:

變長數組在實現時實際上退化為了指針,原先定長的數組,它的地址同時也就是容納數組元素位置的首地址,而變長數組,退化為了指針,該指針指向的位置才是真正容納數組元素的首地址.

二維數組或是char** p的原理應該都是這樣的吧?
請指教
2009-11-02 09:45 | zuhd

# re: 使用gdb跟蹤C語言中變長數組的實現  回復  更多評論   

@zuhd
可能我的意思表達不清楚,我補充了一個示意圖,你可以再看看.
BTW:那個不是二維數組,而是存放的元素類型都是char*的數組,本質還是一維數組,說到這個點又是"指針與數組的區別"了,呵呵.

2009-11-03 09:03 | 那誰

# re: 使用gdb跟蹤C語言中變長數組的實現  回復  更多評論   

www.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.comwww.mardanjan2020.51.com
2011-05-21 14:25 | mardanjan

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久疯狂做爰流白浆xx| 欧美午夜一区二区三区免费大片| 欧美日韩国产一级片| 在线视频中文亚洲| 亚洲综合不卡| 亚洲国产一区二区精品专区| 亚洲精品欧美日韩专区| 国产精品手机视频| 免费视频最近日韩| 欧美视频在线观看免费网址| 久久精品国产亚洲高清剧情介绍| 免费在线观看成人av| 亚洲女同精品视频| 久热精品视频在线观看一区| 亚洲一区二区精品在线观看| 久久久久久尹人网香蕉| 亚洲性感激情| 欧美粗暴jizz性欧美20| 欧美在线一二三四区| 欧美成人午夜77777| 欧美在线观看视频一区二区三区| 蜜桃av一区二区| 亚洲激情影视| 欧美一区网站| 亚洲欧美日本另类| 欧美精品www| 麻豆av福利av久久av| 欧美性一区二区| 亚洲国产一区二区视频| 国产婷婷97碰碰久久人人蜜臀| 欧美激情免费观看| 黄色一区二区在线| 性欧美xxxx视频在线观看| 一本久久综合亚洲鲁鲁| 美女网站久久| 蜜臀av一级做a爰片久久| 国产精品资源| 在线视频你懂得一区| 99精品99| 欧美激情一区二区三区在线视频 | 日韩西西人体444www| 亚洲国产99精品国自产| 久久精品免费观看| 久久精品人人做人人综合| 欧美性大战xxxxx久久久| 亚洲精品在线二区| 一区二区三区产品免费精品久久75 | 午夜精品一区二区三区电影天堂| 亚洲片区在线| 美女国产一区| 欧美福利电影网| 在线日韩中文字幕| 久久阴道视频| 久久久久久久综合狠狠综合| 国产精品尤物福利片在线观看| 亚洲深夜激情| 欧美一二三视频| 国模精品一区二区三区色天香| 国产精品久久9| 一级日韩一区在线观看| 亚洲视频999| 国产精品久久久久aaaa九色| 亚洲香蕉网站| 亚洲一区欧美一区| 国产精品视频yy9299一区| 亚洲免费网址| 久久久久久午夜| 亚洲国产欧美不卡在线观看| 欧美大片在线影院| 一本色道久久综合一区| 欧美综合77777色婷婷| 一区二区三区在线观看欧美| 免费日韩精品中文字幕视频在线| 亚洲精品韩国| 午夜精品成人在线| 国产精品每日更新| 久久蜜桃资源一区二区老牛| 欧美不卡视频一区发布| 日韩视频精品在线| 欧美日韩午夜在线| 亚洲欧美国产日韩天堂区| 久久色在线播放| 日韩亚洲欧美成人| 国产精品美女| 久久久久亚洲综合| 日韩视频一区二区三区在线播放免费观看 | 日韩视频第一页| 国产精品日韩电影| 久久精品视频99| 亚洲肉体裸体xxxx137| 亚洲自拍偷拍一区| 在线色欧美三级视频| 欧美日韩一区二区三区四区在线观看| 亚洲欧美国产毛片在线| 亚洲国产精品电影| 久久精品亚洲一区二区| 亚洲精品一区二区三区在线观看| 国产精品久久久久久模特 | 久久精品亚洲精品| 日韩亚洲一区二区| 亚洲午夜国产一区99re久久 | 久久精品五月| 日韩小视频在线观看| 国产亚洲欧美日韩一区二区| 欧美成人三级在线| 欧美在线影院在线视频| 亚洲人成免费| 免费久久99精品国产| 亚洲男人的天堂在线| 91久久精品一区二区三区| 国产精品亚洲精品| 欧美日韩国产首页| 美国成人直播| 久久精品免费| 欧美一区国产一区| 亚洲午夜一区二区三区| 欧美激情一区二区三级高清视频| 午夜精品久久久久久久| 国产性猛交xxxx免费看久久| 亚洲视频1区| 久久米奇亚洲| 亚洲自拍偷拍福利| 亚洲第一视频网站| 欧美成人免费全部| 久久亚洲不卡| 久久综合99re88久久爱| 欧美亚洲一区在线| 亚洲一本视频| 一区二区日韩欧美| 99精品欧美一区| 亚洲精品乱码久久久久久黑人| 黄色成人精品网站| 狠狠色伊人亚洲综合网站色| 亚洲国产成人精品视频| 国产精品久久久久久福利一牛影视| 欧美国产日韩亚洲一区| 久久久欧美一区二区| 久久久噜噜噜久久中文字免| 欧美在线综合| 久久激情一区| 久久久99精品免费观看不卡| 性做久久久久久免费观看欧美 | 亚洲国产欧美另类丝袜| 影音先锋日韩精品| 在线播放亚洲一区| 亚洲国产婷婷香蕉久久久久久| 亚洲国产精品女人久久久| 在线欧美日韩国产| 亚洲国产精品第一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲国产欧美国产综合一区| 亚洲欧洲在线免费| 夜夜嗨av一区二区三区网页| 一区二区三区欧美在线| 亚洲一区二区在线看| 欧美一级久久久久久久大片| 久久成人精品无人区| 久久久久久噜噜噜久久久精品 | 国产精品视频免费一区| 国产欧美精品日韩| 黄色一区三区| 亚洲久久视频| 亚洲欧美日韩国产综合精品二区| 亚洲性视频h| 久久国产综合精品| 欧美成黄导航| 99伊人成综合| 欧美一区=区| 欧美电影免费观看高清| 国产精品久久久久高潮| 国内一区二区三区在线视频| 亚洲日产国产精品| 亚洲主播在线播放| 免费在线观看精品| 99精品国产热久久91蜜凸| 亚洲欧美国产三级| 免费一级欧美在线大片| 国产精品久久久久久妇女6080| 黄色精品一二区| 中国成人亚色综合网站| 先锋影音一区二区三区| 久久亚洲精选| 亚洲看片网站| 欧美中文字幕精品| 欧美日韩综合视频网址| 国产一区日韩欧美| aa级大片欧美| 老司机午夜精品| 亚洲视屏一区| 欧美高清不卡在线| 国产主播一区二区三区| 亚洲视频一起| 亚洲第一偷拍| 欧美一区二粉嫩精品国产一线天| 欧美国产高潮xxxx1819| 久久国产精品久久久| 日韩亚洲国产欧美| 亚洲欧美日韩在线观看a三区| 国产精品免费看片| 亚洲麻豆av|