精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

數組越界及其避免方法,C語言數組越界詳解

開發 后端
所謂的數組越界,簡單地講就是指數組下標變量的取值超過了初始定義時的大小,導致對數組元素的訪問出現在數組的范圍之外,這類錯誤也是 C 語言程序中最常見的錯誤之一。

 [[383398]]

所謂的數組越界,簡單地講就是指數組下標變量的取值超過了初始定義時的大小,導致對數組元素的訪問出現在數組的范圍之外,這類錯誤也是 C 語言程序中最常見的錯誤之一。

在 C 語言中,數組必須是靜態的。換而言之,數組的大小必須在程序運行前就確定下來。由于 C 語言并不具有類似 Java 等語言中現有的靜態分析工具的功能,可以對程序中數組下標取值范圍進行嚴格檢查,一旦發現數組上溢或下溢,都會因拋出異常而終止程序。也就是說,C 語言并不檢驗數組邊界,數組的兩端都有可能越界,從而使其他變量的數據甚至程序代碼被破壞。

因此,數組下標的取值范圍只能預先推斷一個值來確定數組的維數,而檢驗數組的邊界是程序員的職責。

一般情況下,數組的越界錯誤主要包括兩種:數組下標取值越界與指向數組的指針的指向范圍越界。

數組下標取值越界

數組下標取值越界主要是指訪問數組的時候,下標的取值不在已定義好的數組的取值范圍內,而訪問的是無法獲取的內存地址。例如,對于數組 int a[3],它的下標取值范圍是[0,2](即a[0]、a[1] 與 a[2])。如果我們的取值不在這個范圍內(如 a[3]),就會發生越界錯誤。示例代碼如下所示: 

  1. 1int a[3];  
  2. 2int i=0 
  3. 3for(i=0;i<4;i++)  
  4. 4{  
  5. 5    a[i] = i;  
  6. 6}  
  7. 7for(i=0;i<4;i++)  
  8. 8{  
  9. 9    printf("a[%d]=%d\n",i,a[i]);  
  10. 0} 

很顯然,在上面的示例程序中,訪問 a[3] 是非法的,將會發生越界錯誤。因此,我們應該將上面的代碼修改成如下形式: 

  1. 1int a[3];  
  2. 2int i=0 
  3. 3for(i=0;i<3;i++)  
  4. 4{  
  5. 5    a[i] = i;  
  6. 6}  
  7. 7for(i=0;i<3;i++)  
  8. 8{  
  9. 9    printf("a[%d]=%d\n",i,a[i]);  
  10. 0} 

指向數組的指針的指向范圍越界

指向數組的指針的指向范圍越界是指定義數組時會返回一個指向第一個變量的頭指針,對這個指針進行加減運算可以向前或向后移動這個指針,進而訪問數組中所有的變量。但在移動指針時,如果不注意移動的次數和位置,會使指針指向數組以外的位置,導致數組發生越界錯誤。下面的示例代碼就是移動指針時沒有考慮到移動的次數和數組的范圍,從而使程序訪問了數組以外的存儲單元。 

  1.  1int i;  
  2.  2int *p;  
  3.  3int a[5];  
  4.  4/*數組a的頭指針賦值給指針p*/  
  5.  5p=a 
  6.  6for(i=0;i<10;i++)  
  7.  7{  
  8.  8    /*指針p指向的變量*/  
  9.  9    *p=i+10;  
  10. 10    /*指針p下一個變量*/  
  11. 11    p++;  
  12. 12} 

在上面的示例代碼中,for 循環會使指針 p 向后移動 10 次,并且每次向指針指向的單元賦值。但是,這里數組 a 的下標取值范圍是 [0,4](即 a[0]、a[1]、a[2]、a[3] 與 a[4])。因此,后 5 次的操作會對未知的內存區域賦值,而這種向內存未知區域賦值的操作會使系統發生錯誤。正確的操作應該是指針移動的次數與數組中的變量個數相同,如下面的代碼所示: 

  1.  1int i;  
  2.  2int *p;  
  3.  3int a[5];  
  4.  4/*數組a的頭指針賦值給指針p*/  
  5.  5p=a 
  6.  6for(i=0;i<5;i++)  
  7.  7{  
  8.  8    /*指針p指向的變量*/  
  9.  9    *p=i+10;  
  10. 10    /*指針p下一個變量*/  
  11. 11    p++;  
  12. 12} 

為了加深大家對數組越界的了解,下面通過一段完整的數組越界示例來演示編程中數組越界將會導致哪些問題。 

  1.  1#define PASSWORD "123456"  
  2.  2int Test(char *str)  
  3.  3{  
  4.  4    int flag;  
  5.  5    char buffer[7];  
  6.  6    flag=strcmp(str,PASSWORD);  
  7.  7    strcpy(buffer,str);  
  8.  8    return flag;  
  9.  9}  
  10. 10int main(void)  
  11. 11{  
  12. 12    int flag=0 
  13. 13    char str[1024];  
  14. 14    while(1)  
  15. 15    {  
  16. 16        printf("請輸入密碼:  ");  
  17. 17        scanf("%s",str);  
  18. 18        flag = Test(str);  
  19. 19        if(flag)  
  20. 20        {  
  21. 21            printf("密碼錯誤!\n");  
  22. 22        }  
  23. 23            else  
  24. 24            {  
  25. 25                printf("密碼正確!\n");  
  26. 26            }  
  27. 27    }  
  28. 28    return 0;  
  29. 29} 

上面的示例代碼模擬了一個密碼驗證的例子,它將用戶輸入的密碼與宏定義中的密碼123456進行比較。很顯然,本示例中最大的設計漏洞就在于 Test() 函數中的 strcpy(buffer,str) 調用。

由于程序將用戶輸入的字符串原封不動地復制到 Test() 函數的數組 char buffer[7] 中。因此,當用戶的輸入大于 7 個字符的緩沖區尺寸時,就會發生數組越界錯誤,這也就是大家所謂的緩沖區溢出Buffer overflow 漏洞。

但是要注意,如果這個時候我們根據緩沖區溢出發生的具體情況填充緩沖區,不但可以避免程序崩潰,還會影響到程序的執行流程,甚至會讓程序去執行緩沖區里的代碼。示例運行結果為: 

  1.  1請輸入密碼:12345  
  2.  2密碼錯誤!  
  3.  3請輸入密碼:123456  
  4.  4密碼正確!  
  5.  5請輸入密碼:1234567  
  6.  6密碼正確!  
  7.  7請輸入密碼:aaaaaaa  
  8.  8密碼正確!  
  9.  9請輸入密碼:0123456  
  10. 10密碼錯誤!  
  11. 11請輸入密碼: 

在示例代碼中,flag 變量實際上是一個標志變量,其值將決定著程序是進入密碼錯誤的流程(非 0)還是“密碼正確”的流程(0)。當我們輸入錯誤的字符串1234567或者aaaaaaa,程序也都會輸出“密碼正確”。但在輸入0123456的時候,程序卻輸出“密碼錯誤”,這究竟是為什么呢?

其實,原因很簡單。當調用 Test() 函數時,系統將會給它分配一片連續的內存空間,而變量 char buffer[7] 與 int flag 將會緊挨著進行存儲,用戶輸入的字符串將會被復制進 buffer[7] 中。如果這個時候,我們輸入的字符串數量超過 6 個(注意,有字符串截斷符也算一個),那么超出的部分將破壞掉與它緊鄰著的 flag 變量的內容。

當輸入的密碼不是宏定義的123456時,字符串比較將返回 1 或 -1。我們都知道,內存中的數據按照 4 字節(DWORD)逆序存儲,所以當 flag 為 1 時,在內存中存儲的是0x01000000。如果我們輸入包含 7 個字符的錯誤密碼,如aaaaaaa,那么字符串截斷符 0x00 將寫入 flag 變量,這樣溢出數組的一個字節 0x00 將恰好把逆序存放的 flag 變量改為 0x00000000。在函數返回后,一旦 main 函數的 flag 為 0,就會輸出“密碼正確”。這樣,我們就用錯誤的密碼得到了正確密碼的運行效果。

而對于0123456,因為在進行字符串的大小比較時,它小于123456,flag的值是 -1,在內存中將按照補碼存放負數,所以實際存儲的不是 0x01000000 而是 0xffffffff。那么字符串截斷后符 0x00 淹沒后,變成 0x00ffffff,還是非 0,所以沒有進入正確分支。

其實,本示例只是用一個字節淹沒了鄰接變量,導致程序進入密碼正確的處理流程,使設計的驗證功能失效。

盡量顯式地指定數組的邊界

在 C 語言中,為了提高運行效率,給程序員更大的空間,為指針操作帶來更多的方便,C 語言內部本身不檢查數組下標表達式的取值是否在合法范圍內,也不檢查指向數組元素的指針是不是移出了數組的合法區域。因此,在編程中使用數組時就必須格外謹慎,在對數組進行讀寫操作時都應當進行相應的檢查,以免對數組的操作超過數組的邊界,從而發生緩沖區溢出漏洞。

要避免程序因數組越界所發生的錯誤,首先就需要從數組的邊界定義開始。盡量顯式地指定數組的邊界,即使它已經由初始化值列表隱式指定。示例代碼如下所示: 

  1. 1int a[]={1,2,3,4,5,6,7,8,9,10}; 

很顯然,對于上面的數組 a[],雖然編譯器可以根據始化值列表來計算出數組的長度。但是,如果我們顯式地指定該數組的長度,例如: 

  1. 1int a[10]={1,2,3,4,5,6,7,8,9,10}; 

它不僅使程序具有更好的可讀性,并且大多數編譯器在數組長度小于初始化值列表的長度時還會發生相應警告。

當然,也可以使用宏的形式來顯式指定數組的邊界(實際上,這也是最常用的指定方法),如下面的代碼所示: 

  1. 1#define MAX 10  
  2. 2…  
  3. 3int a[MAX]={1,2,3,4,5,6,7,8,9,10}; 

除此之外,在 C99 標準中,還允許我們使用單個指示符為數組的兩段“分配”空間,如下面的代碼所示: 

  1. 1int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10}; 

在上面的 a[MAX]數組中,如果 MAX 大于 10,數組中間將用 0 值元素進行填充(填充的個數為 MAX-10,并從 a[5] 開始進行 0 值填充);如果 MAX 小于 10,[MAX-5]之前的 5 個元素(1,2,3,4,5)中將有幾個被[MAX-5]之后的 5 個元素(6,7,8,9,10)所覆蓋,示例代碼如下所示: 

  1.  1#define MAX 10  
  2.  2#define MAX1 15  
  3.  3#define MAX2 6  
  4.  4int main(void)  
  5.  5{  
  6.  6    int a[MAX]={1,2,3,4,5,[MAX-5]=6,7,8,9,10};  
  7.  7    int b[MAX1]={1,2,3,4,5,[MAX1-5]=6,7,8,9,10};  
  8.  8    int c[MAX2]={1,2,3,4,5,[MAX2-5]=6,7,8,9,10};  
  9.  9    int i=0 
  10. 10    int j=0 
  11. 11    int z=0
  12. 12    printf("a[MAX]:\n");  
  13. 13    for(i=0;i<MAX;i++)  
  14. 14    {  
  15. 15        printf("a[%d]=%d ",i,a[i]); 
  16. 16    }  
  17. 17    printf("\nb[MAX1]:\n");  
  18. 18    for(j=0;j<MAX1;j++)  
  19. 19    {  
  20. 20        printf("b[%d]=%d ",j,b[j]);  
  21. 21    }  
  22. 22    printf("\nc[MAX2]:\n");  
  23. 23    for(z=0;z<MAX2;z++)  
  24. 24    {  
  25. 25        printf("c[%d]=%d ",z,c[z]);  
  26. 26    }  
  27. 27    printf("\n");  
  28. 28    return 0;  
  29. 29} 

運行結果為: 

  1. 1a[MAX]:  
  2. 2a[0]=1 a[1]=2 a[2]=3 a[3]=4 a[4]=5 a[5]=6 a[6]=7 a[7]=8 a[8]=9 a[9]=10  
  3. 3b[MAX1]: 
  4. 4b[0]=1 b[1]=2 b[2]=3 b[3]=4 b[4]=5 b[5]=0 b[6]=0 b[7]=0 b[8]=0 b[9]=0 b[10]=6 b[11]=7 b[12]=8 b[13]=9 b[14]=10  
  5. 5c[MAX2]:  
  6. 6c[0]=1 c[1]=6 c[2]=7 c[3]=8 c[4]=9 c[5]=10 

對數組做越界檢查,確保索引值位于合法的范圍之內

要避免數組越界,除了上面所闡述的顯式指定數組的邊界之外,還可以在數組使用之前進行越界檢查,檢查數組的界限和字符串(也以數組的方式存放)的結束,以保證數組索引值位于合法的范圍之內。例如,在寫處理數組的函數時,一般應該有一個范圍參數;在處理字符串時總檢查是否遇到空字符‘\0’。

來看下面一段代碼示例: 

  1.  1#define ARRAY_NUM 10  
  2.  2int *TestArray(int num,int value)  
  3.  3{  
  4.  4    int *arr=NULL 
  5.  5    arr=(int *)malloc(sizeof(int)*ARRAY_NUM);  
  6.  6    if(arr!=NULL)  
  7.  7    {  
  8.  8        arr[num]=value;  
  9.  9    }  
  10. 10    else  
  11. 11    {  
  12. 12        /*處理arr==NULL*/  
  13. 13    }  
  14. 14    return arr;  
  15. 15} 

從上面的int*TestArray(int num,int value)函數中不難看出,其中存在著一個很明顯的問題,那就是無法保證 num 參數是否越界(即當num>=ARRAY_NUM的情況)。因此,應該對 num 參數進行越界檢查,示例代碼如下所示: 

  1. 1int *TestArray(int num,int value)  
  2.  2{ 
  3.  3    int *arr=NULL 
  4.  4    /*越界檢查(越上界)*/  
  5.  5    if(num<ARRAY_NUM 
  6.  6    {  
  7.  7        arr=(int *)malloc(sizeof(int)*ARRAY_NUM);  
  8.  8        if(arr!=NULL)  
  9.  9        {  
  10. 10            arr[num]=value; 
  11. 11        } 
  12. 12        else  
  13. 13        {  
  14. 14            /*處理arr==NULL*/  
  15. 15        }  
  16. 16    }  
  17. 17    return arr;  
  18. 18} 

這樣通過if(num<ARRAY_NUM)語句進行越界檢查,從而保證 num 參數沒有越過這個數組的上界。現在看起來,TestArray() 函數應該沒什么問題,也不會發生什么越界錯誤。

但是,如果仔細檢查,TestArray() 函數仍然還存在一個致命的問題,那就是沒有檢查數組的下界。由于這里的 num 參數類型是 int 類型,因此可能為負數。如果 num 參數所傳遞的值為負數,將導致在 arr 所引用的內存邊界之外進行寫入。

當然,你可以通過向if(num<ARRAY_NUM)語句里面再加一個條件進行測試,如下面的代碼所示: 

  1. 1if(num>=0&&num<ARRAY_NUM 
  2. 2{  
  3. 3} 

但是,這樣的函數形式對調用者來說是不友好的(由于 int 類型的原因,對調用者來說仍然可以傳遞負數,至于在函數中怎么處理那是另外一件事情),因此,最佳的解決方案是將 num 參數聲明為 size_t 類型,從根本上防止它傳遞負數,示例代碼如下所示: 

  1. 1int *TestArray(size_t num,int value)  
  2.  2{  
  3.  3    int *arr=NULL 
  4.  4    /*越界檢查(越上界)*/  
  5.  5    if(num<ARRAY_NUM 
  6.  6    {  
  7.  7        arr=(int *)malloc(sizeof(int)*ARRAY_NUM);  
  8.  8        if(arr!=NULL)  
  9.  9        {  
  10. 10            arr[num]=value;  
  11. 11        } 
  12. 12        else  
  13. 13        {  
  14. 14            /*處理arr==NULL*/  
  15. 15        }  
  16. 16    }  
  17. 17    return arr;  
  18. 18} 

獲取數組的長度時不要對指針應用 sizeof 操作符

在 C 語言中,sizeof 這個其貌不揚的家伙經常會讓無數程序員叫苦連連。同時,它也是各大公司爭相選用的面試必備題目。簡單地講,sizeof 是一個單目操作符,不是函數。其作用就是返回一個操作數所占的內存字節數。其中,操作數可以是一個表達式或括在括號內的類型名,操作數的存儲大小由操作數的類型來決定。例如,對于數組 int a[5],可以使用sizeof(a)來獲取數組的長度,使用sizeof(a[0])來獲取數組元素的長度。

但需要注意的是,sizeof 操作符不能用于函數類型、不完全類型(指具有未知存儲大小的數據類型,如未知存儲大小的數組類型、未知內容的結構或聯合類型、void 類型等)與位字段。例如,以下都是不正確形式: 

  1. 1/*若此時max定義為intmax();*/  
  2.  2sizeof(max)  
  3.  3/*若此時arr定義為char arr[MAX],且MAX未知*/  
  4.  4sizeof(arr)  
  5.  5/*不能夠用于void類型*/  
  6.  6sizeof(void)  
  7.  7/*不能夠用于位字段*/  
  8.  8struct S  
  9.  9{  
  10. 10    unsigned int f1 : 1;  
  11. 11    unsigned int f2 : 5;  
  12. 12    unsigned int f3 : 12;  
  13. 13};  
  14. 14sizeof(S.f1); 

了解 sizeof 操作符之后,現在來看下面的示例代碼: 

  1. 1void Init(int arr[])  
  2.  2{  
  3.  3    size_t i=0 
  4.  4    for(i=0;i<sizeof(arr)/sizeof(arr[0]);i++)  
  5.  5    {  
  6.  6        arr[i]=i;  
  7.  7    }  
  8.  8}  
  9.  9int main(void)  
  10. 10{  
  11. 11    int i=0 
  12. 12    int a[10];  
  13. 13    Init(a);  
  14. 14    for(i=0;i<10;i++)  
  15. 15    {  
  16. 16        printf("%d\n",a[i]);  
  17. 17    }  
  18. 18    return 0;  
  19. 19} 

從表面看,上面代碼的輸出結果應該是0,1,2,3,4,5,6,7,8,9,但實際結果卻出乎我們的意料,如圖 1 所示。

圖 1 示例代碼在 VC++2010 中的運行結果

是什么原因導致這個結果呢?

很顯然,上面的示例代碼在void Init(int arr[])函數中接收了一個int arr[]類型的形參,并且在main函數中向它傳遞一個a[10]實參。同時,在 Init() 函數中通過sizeof(arr)/sizeof(arr[0])來確定這個數組元素的數量和初始化值。

在這里出現了一個很大問題:由于 arr 參數是一個形參,它是一個指針類型,其結果是sizeof(arr)=sizeof(int*)。在 IA-32 中,sizeof(arr)/sizeof(arr[0])的結果為 1。因此,最后的結果如圖 1 所示。

對于上面的示例代碼,我們可以通過傳入數組的長度的方式來解決這個問題,示例代碼如下: 

  1.  1void Init(int arr[],size_t arr_len)  
  2.  2{  
  3.  3    size_t i=0 
  4.  4    for(i=0;i<arr_len;i++)  
  5.  5    {  
  6.  6        arr[i]=i;  
  7.  7    }  
  8.  8}  
  9.  9int main(void)  
  10. 10{  
  11. 11    int i=0 
  12. 12    int a[10];  
  13. 13    Init(a,10);  
  14. 14    for(i=0;i<10;i++)  
  15. 15    {  
  16. 16        printf("%d\n",a[i]);  
  17. 17    }  
  18. 18    return 0;  
  19. 19} 

除此之外,我們還可以通過指針的方式來解決上面的問題,示例代碼如下所示: 

  1. 1void Init(int (*arr)[10])  
  2.  2{  
  3.  3    size_t i=0 
  4.  4    for(i=0;i< sizeof(*arr)/sizeof(int);i++)  
  5.  5    {  
  6.  6        (*arr)[i]=i;  
  7.  7    }  
  8.  8} 
  9.  9int main(void)  
  10. 10{  
  11. 11    int i=0 
  12. 12    int a[10];  
  13. 13    Init(&a);  
  14. 14    for(i=0;i<10;i++)  
  15. 15    {  
  16. 16        printf("%d\n",a[i]);  
  17. 17    }  
  18. 18    return 0;  
  19. 19} 

現在,Init() 函數中的 arr 參數是一個指向arr[10]類型的指針。需要特別注意的是,這里絕對不能夠使用void Init(int(*arr)[])來聲明函數,而是必須指明要傳入的數組的大小,否則sizeof(*arr)無法計算。但是在這種情況下,再通過 sizeof 來計算數組大小已經沒有意義了,因為此時數組大小已經指定為 10 了。 

 

責任編輯:龐桂玉 來源: C語言與C++編程
相關推薦

2009-09-02 13:15:23

C#數組復制

2016-12-05 13:35:02

C語言數組指針

2024-01-29 00:30:00

C語言代碼數組

2023-11-04 16:26:18

C語言數組

2025-08-29 02:10:00

UBSan數組C++

2021-04-12 09:16:43

Go 邊界檢查

2016-10-08 21:25:36

Javascript數組Web

2011-08-17 11:05:22

Objective-C方法

2009-09-02 11:02:57

C#動態數組

2009-08-31 14:56:32

C# Byte數組轉換

2021-12-21 06:09:05

Python切片索引

2009-11-17 09:02:36

PHP數組賦值

2016-12-27 10:19:42

JavaScriptindexOf

2010-12-30 09:22:58

C語言 數組

2023-12-21 11:46:48

C語言柔性數組開發

2009-08-28 11:43:26

C#數組初始化

2009-09-02 16:52:55

C#數組初始化

2009-09-17 18:07:22

C#動態數組

2009-09-18 10:58:31

C#數組操作

2009-09-02 11:18:10

C#動態數組
點贊
收藏

51CTO技術棧公眾號

国产一区二区中文| 色鬼7777久久| 欧美国产另类| 日韩视频免费直播| 日韩欧美视频免费在线观看| 国产美女无遮挡永久免费| 99视频精品全部免费在线视频| 欧美午夜在线观看| 中文字幕日韩一区二区三区| 国产美女无遮挡永久免费| 欧美1区2区| 日韩激情视频在线| 男女污污的视频| 国产在线高潮| 成人精品国产免费网站| 91精品国产高清久久久久久久久| 国产精品久久久久久免费观看| 日本不卡久久| 中文字幕 人妻熟女| 国产成人三级| 欧美一区二区三区爱爱| 日韩精品在线中文字幕| 日本视频在线观看一区二区三区| 日韩成人一级片| 久久影院中文字幕| 老司机午夜免费福利| 超碰一区二区| 国产精品电影院| 国产成人av一区二区三区| 午夜婷婷在线观看| 欧美xxav| 日韩精品视频免费| 色一情一区二区| 韩日毛片在线观看| 中文字幕一区二区在线观看| 久久99九九| 99在线观看精品视频| 免费一区视频| 欧美贵妇videos办公室| 日本爱爱爱视频| 国产96在线亚洲| 欧美日韩国产在线观看| 分分操这里只有精品| 毛片av在线| 久久精品一区二区三区四区| 97久久天天综合色天天综合色hd | 凹凸精品一区二区三区| 国产在线不卡| 久久精品国产亚洲一区二区| 成年人免费观看视频网站| 欧美视频精品全部免费观看| 欧美日韩国内自拍| 一卡二卡三卡视频| 性欧美高清come| 国产精品高潮久久久久无| 欧美激情专区| 天天影院图片亚洲| 成人动漫在线一区| a级国产乱理论片在线观看99| 日韩久久久久久久久久| 午夜一区不卡| 777国产偷窥盗摄精品视频| 欧美成人三级视频| 国产精品毛片一区二区在线看| 亚洲人成伊人成综合网久久久 | 国产精品正在播放| 91精品久久久久久综合乱菊| 69xxxx国产| 久久不射网站| 日韩av手机在线| 亚洲欧美精品一区二区三区| 国产欧美一区二区色老头| 久久久久久久久爱| 久草视频在线资源站| 欧美激情视频一区二区三区免费| 一本色道久久综合狠狠躁篇的优点 | 韩国三级与黑人| 国产视频一区二| 日韩一区国产二区欧美三区| 青娱乐精品在线| 精品国产亚洲一区二区三区在线| 欧美在线视频你懂得| 久久久久久久少妇| 欧美xnxx| 4438成人网| 26uuu国产| 亚洲经典视频| 亚洲国产精品成人va在线观看| 日韩综合第一页| 欧美黄色录像| 亚洲另类xxxx| 亚洲图片第一页| 亚洲久久久久| 久久久久久久久久久成人| 久久久精品视频免费观看| 欧美91大片| 欧美亚洲成人免费| 天天干天天插天天射| 蜜桃av噜噜一区| 亚洲tv在线观看| 丰满熟妇人妻中文字幕| 91丝袜国产在线播放| 视频一区二区综合| 成人影院www在线观看| 亚洲最大成人网4388xx| 日本日本19xxxⅹhd乱影响| 亚洲wwww| 日韩无一区二区| 亚洲一区二区观看| 红桃成人av在线播放| 精品国产一区二区三区在线观看 | 国产一级免费在线观看| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩av电影在线播放| 亚洲天堂网在线视频| 韩日精品视频一区| 精品视频一区二区| 麻豆影院在线| 精品久久久久久久久国产字幕| 性生交免费视频| 红杏成人性视频免费看| 色777狠狠综合秋免鲁丝| 日韩人妻无码一区二区三区99| 美女视频黄a大片欧美| 国产精品免费一区二区三区| 97最新国自产拍视频在线完整在线看| 亚欧色一区w666天堂| 一级做a爱视频| 精品视频免费在线观看| 538国产精品一区二区在线| 国产成人三级一区二区在线观看一 | 国产人妖一区二区三区| 国产人妖乱国产精品人妖| 久久这里只有精品23| 91麻豆精品国产91久久久久推荐资源| 中文字幕欧美日韩va免费视频| 韩国av中文字幕| 成人免费观看av| 蜜臀av性久久久久蜜臀av| 国产精品久久久久久久久免费高清| 亚洲久久久久久久久久| 国产精品xxxx喷水欧美| 成人av综合一区| av一区二区三区免费观看| 玖玖玖电影综合影院| 久久不射电影网| 国产乱淫片视频| 亚洲欧洲精品一区二区三区不卡| 亚洲欧美国产日韩综合| 欧美色婷婷久久99精品红桃| 日本久久久久久久| 美国一级片在线免费观看视频| 欧美性猛交xxxx免费看| 老牛影视av老牛影视av| 欧美在线综合| 日韩免费av电影| 视频精品导航| 中文字幕久精品免费视频| 在线观看国产黄| 国产精品久久三| 极品粉嫩美女露脸啪啪| 亚洲啊v在线观看| 999国内精品视频在线| 26uuu亚洲电影在线观看| 日韩欧美在线1卡| 天堂资源在线播放| 91免费观看在线| 精品少妇无遮挡毛片| 欧美高清视频手机在在线| 成人黄色大片在线免费观看| 18+视频在线观看| 欧美一级片在线观看| 国产精品99无码一区二区| 91原创在线视频| 别急慢慢来1978如如2| 五月开心六月丁香综合色啪| 91手机在线播放| 国产h片在线观看| 亚洲性猛交xxxxwww| 国产又黄又大又粗的视频| 一区二区三区日韩| 人妻熟女aⅴ一区二区三区汇编| 久久一区亚洲| 中文字幕一区综合| 高清日韩中文字幕| 国产精品av免费在线观看| av在线免费网址| 日韩成人在线电影网| 中文字幕在线观看精品| 亚洲永久精品国产| 公肉吊粗大爽色翁浪妇视频| 寂寞少妇一区二区三区| 91视频 -- 69xx| 99久久.com| 欧美连裤袜在线视频| 伊人久久大香伊蕉在人线观看热v| 欧美极品美女电影一区| 精品无吗乱吗av国产爱色| 日韩欧美视频在线| 九九热最新视频| 亚洲国产精品欧美一二99| 成年人在线免费看片| 成人午夜电影久久影院| 一区二区三区免费播放| 黄色亚洲免费| 一区二区三区四区在线视频| 大香伊人久久精品一区二区| 国产精品日韩精品| 91吃瓜在线观看| 日韩中文字幕在线播放| 日韩亚洲视频在线观看| 日韩一区二区三区免费观看| 国产三级精品三级在线观看| 亚洲精品视频自拍| 污污视频网站在线免费观看| 97国产一区二区| 1314成人网| 毛片av中文字幕一区二区| 国产黄色一级网站| 欧美午夜免费影院| 最新国产精品久久| 精品一区不卡| 欧美极品色图| 久9re热视频这里只有精品| 亚洲专区中文字幕| 国产成人77亚洲精品www| 日本欧美黄网站| 白浆视频在线观看| 欧美激情一区二区三级高清视频 | 久久天堂电影网| av电影在线播放高清免费观看| 精品视频在线播放免| 高h调教冰块play男男双性文| 欧美人妖巨大在线| 中文字幕久久熟女蜜桃| 欧美性猛交xxxx乱大交| 日本中文字幕第一页| 天天综合网天天综合色| 日韩毛片在线视频| 亚洲午夜视频在线观看| 青娱乐在线视频免费观看| 亚洲男同性恋视频| 欧美激情图片小说| 亚洲女人****多毛耸耸8| 欧美肥妇bbwbbw| 综合激情成人伊人| 亚洲一级生活片| 亚洲婷婷综合色高清在线| 老熟妻内射精品一区| 亚洲人一二三区| 全网免费在线播放视频入口| 亚洲欧美激情在线| 久久视频免费看| 亚洲国产日韩一区二区| 国产成人啪精品午夜在线观看| 亚洲最新视频在线播放| 久久综合色综合| 亚洲成a人v欧美综合天堂| 日本少妇在线观看| 欧美体内谢she精2性欧美| 亚洲 欧美 中文字幕| 欧美在线不卡视频| 凹凸精品一区二区三区| 宅男噜噜噜66一区二区66| 成人av无码一区二区三区| 欧美videossexotv100| 神宫寺奈绪一区二区三区| 精品小视频在线| 第三区美女视频在线| 精品国产依人香蕉在线精品| 主播国产精品| 2018日韩中文字幕| 蜜桃视频成人m3u8| 91影院在线免费观看视频| 久久a爱视频| 视频一区二区在线| 欧美大片专区| 亚洲 高清 成人 动漫| 日本aⅴ免费视频一区二区三区| 一区二区免费av| 欧美高清第一页| 在线视频播放大全| 6080亚洲精品一区二区| 亚洲男女视频在线观看| 亚洲人成人99网站| 搞黄网站在线观看| 97国产一区二区精品久久呦| 亚洲精品在线影院| 2019国产精品视频| 国产日产精品_国产精品毛片| 永久域名在线精品| 在线亚洲国产精品网站| 久草在在线视频| 国产精品一级片| 亚洲欧美视频在线播放| 中文字幕精品一区二区精品绿巨人| 欧美日韩在线国产| 91成人在线精品| 性生交生活影碟片| 国产亚洲精品激情久久| 亚洲婷婷噜噜| 国产精品91视频| jizz性欧美23| 伊人久久婷婷色综合98网| 亚洲伦伦在线| 亚洲精品中文字幕乱码无线| 91亚洲男人天堂| 日日骚一区二区三区| 91福利国产精品| 日韩有码第一页| 久久国产精品久久久久久久久久| 天天免费亚洲黑人免费| 国产精品亚洲综合| 99久久久久| 精品久久久噜噜噜噜久久图片| 成人国产精品视频| 成人在线观看免费完整| 欧美丝袜丝交足nylons图片| 四虎永久在线观看| 欧美刺激性大交免费视频| 日韩av首页| 久久影视中文粉嫩av| 午夜久久影院| 亚洲自拍第三页| 中文字幕一区二区三区在线播放| 日韩人妻精品中文字幕| 精品88久久久久88久久久| 日本三级在线播放完整版| 国产成人欧美在线观看| 欧美一区二区三区红桃小说| 国产成人在线小视频| 国产麻豆精品在线| 小嫩苞一区二区三区| 欧美视频一区在线观看| 免费人成在线观看网站| 欧美一级视频在线观看| 国产精品白浆| 欧美 日韩 亚洲 一区| 成人国产视频在线观看| 久久综合加勒比| 精品国产乱码久久久久久影片| 直接在线观看的三级网址| 91麻豆国产精品| 亚洲女同一区| 日韩欧美中文视频| 亚洲天堂免费看| 国产免费不卡视频| 久久亚洲成人精品| 国产精品1区在线| 粉嫩av一区二区三区天美传媒 | 亚洲成av人在线观看| 成人午夜精品福利免费| 久久久久久久久久久av| 精品在线网站观看| aa在线观看视频| 久久亚洲私人国产精品va媚药| 丁香社区五月天| 最近2019中文字幕大全第二页| 国产综合色激情| 波多野结衣激情| 丰满亚洲少妇av| 91在线看视频| 夜夜嗨av一区二区三区四区 | 欧美老女人第四色| 精品国产丝袜高跟鞋| 2022国产精品| 国产亚洲午夜| 懂色av粉嫩av浪潮av| 欧美一级视频精品观看| 成人免费一区二区三区牛牛| 精品国产一区二区三区免费| 性xx色xx综合久久久xx| 波多野结衣一二三四区| 欧美一区二区三区不卡| 岛国片av在线| 日本免费高清不卡| 国产综合久久久久久久久久久久| 久久久久99精品成人片试看| 日韩激情视频在线播放| 国产精品亚洲成在人线| 成年在线观看视频| 2021中文字幕一区亚洲| 亚洲字幕av一区二区三区四区| 欧美精品一区在线播放| 卡通动漫精品一区二区三区| youjizzxxxx18| 一级特黄大欧美久久久| 免费黄色在线视频网站| 亚洲自拍偷拍色图| 六月丁香综合| 日韩a级片在线观看| 亚洲精品一区二区在线| 亚洲伊人伊成久久人综合网| 日韩av中文字幕第一页| 欧美国产精品久久| 神马午夜电影一区二区三区在线观看 | 国产一级一片免费播放| 在线看国产精品| 国内露脸中年夫妇交换精品| 中文字幕 91|