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

C語言全局變量那些事兒

開發(fā) 后端 前端
作為一名程序員,如果說沉迷一門編程語言算作一種樂趣的話,那么與此同時(shí)反過來去黑一門編程語言就是這種樂趣的升華。今天我們就來黑一把C語言,好好展示一下這門經(jīng)典語言令人抓狂的一面。

作為一名程序員,如果說沉迷一門編程語言算作一種樂趣的話,那么與此同時(shí)反過來去黑一門編程語言就是這種樂趣的升華。今天我們就來黑一把C語言,好好展示一下這門經(jīng)典語言令人抓狂的一面。

我們知道,全局變量是C語言語法和語義中一個(gè)很重要的知識(shí)點(diǎn),首先它的存在意義需要從三個(gè)不同角度去理解:對(duì)于程序員來說,它是一個(gè)記錄內(nèi)容的變量(variable);對(duì)于編譯/鏈接器來說,它是一個(gè)需要解析的符號(hào)(symbol);對(duì)于計(jì)算機(jī)來說,它可能是具有地址的一塊內(nèi)存(memory)。其次是語法/語義:從作用域上看,帶static關(guān)鍵字的全局變量范圍只能限定在文件里,否則會(huì)外聯(lián)到整個(gè)模塊和項(xiàng)目中;從生存期來看,它是靜態(tài)的,貫穿整個(gè)程序或模塊運(yùn)行期間(注意,正是跨單元訪問和持續(xù)生存周期這兩個(gè)特點(diǎn)使得全局變量往往成為一段受攻擊代碼的突破口,了解這一點(diǎn)十分重要);從空間分配上看,定義且初始化的全局變量在編譯時(shí)在數(shù)據(jù)段(.data)分配空間,定義但未初始化的全局變量暫存(tentative definition)在.bss段,編譯時(shí)自動(dòng)清零,而僅僅是聲明的全局變量只能算個(gè)符號(hào),寄存在編譯器的符號(hào)表內(nèi),不會(huì)分配空間,直到鏈接或者運(yùn)行時(shí)再重定向到相應(yīng)的地址上。

我們將向您展現(xiàn)一下,非static限定全局變量在編譯/鏈接以及程序運(yùn)行時(shí)會(huì)發(fā)生哪些有趣的事情,順便可以對(duì)C編譯器/鏈接器的解析原理管中窺豹。以下示例對(duì)ANSI C和GNU C標(biāo)準(zhǔn)都有效,筆者的編譯環(huán)境是Ubuntu下的GCC-4.4.3。

  1. /* t.h */ 
  2. #ifndef _H_ 
  3. #define _H_ 
  4. int a; 
  5. #endif 
  6.   
  7. /* foo.c */ 
  8. #include <stdio.h> 
  9. #include "t.h" 
  10.   
  11. struct { 
  12.    char a; 
  13.    int b; 
  14. } b = { 2, 4 }; 
  15.   
  16. int main(); 
  17.   
  18. void foo() 
  19.     printf("foo:\t(&a)=0x%08x\n\t(&b)=0x%08x\n 
  20.         \tsizeof(b)=%d\n\tb.a=%d\n\tb.b=%d\n\tmain:0x%08x\n", 
  21.         &a, &b, sizeof b, b.a, b.b, main); 
  22.   
  23. /* main.c */ 
  24. #include <stdio.h> 
  25. #include "t.h" 
  26.   
  27. int b; 
  28. int c; 
  29.   
  30. int main() 
  31.     foo(); 
  32.     printf("main:\t(&a)=0x%08x\n\t(&b)=0x%08x\n 
  33.         \t(&c)=0x%08x\n\tsize(b)=%d\n\tb=%d\n\tc=%d\n", 
  34.         &a, &b, &c, sizeof b, b, c); 
  35.     return 0; 

Makefile如下:

  1. test: main.o foo.o 
  2.     gcc -o test main.o foo.o 
  3.   
  4. main.o: main.c 
  5. foo.o: foo.c 
  6.   
  7. clean: 
  8.     rm *.o test 

運(yùn)行情況:

  1. foo:    (&a)=0x0804a024 
  2.     (&b)=0x0804a014 
  3.     sizeof(b)=8 
  4.     b.a=2 
  5.     b.b=4 
  6.     main:0x080483e4 
  7. main:   (&a)=0x0804a024 
  8.     (&b)=0x0804a014 
  9.     (&c)=0x0804a028 
  10.     size(b)=4 
  11.     b=2 
  12.     c=0 

這個(gè)項(xiàng)目里我們定義了四個(gè)全局變量,t.h頭文件定義了一個(gè)整型a,main.c里定義了兩個(gè)整型b和c并且未初始化,foo.c里定義了一個(gè)初始化了的 結(jié)構(gòu)體,還定義了一個(gè)main的函數(shù)指針變量。由于C語言每個(gè)源文件單獨(dú)編譯,所以t.h分別包含了兩次,所以int a就被定義了兩次。兩個(gè)源文件里變量b和函數(shù)指針變量main被重復(fù)定義了,實(shí)際上可以看做代碼段的地址。但編譯器并未報(bào)錯(cuò),只給出一條警告:

  1. /usr/bin/ld: Warning: size of symbol 'b' changed from 4 in main.o to 8 in foo.o 

運(yùn)行程序發(fā)現(xiàn),main.c打印中b大小是4個(gè)字節(jié),而foo.c是8個(gè)字節(jié),因?yàn)閟izeof關(guān)鍵字是編譯時(shí)決議,而源文件中對(duì)b類型定義不一 樣。但令人驚奇的是無論是在main.c還是foo.c中,a和b都是相同的地址,也就是說,a和b被定義了兩次,b還是不同類型,但內(nèi)存映像中只有一份 拷貝。我們還看到,main.c中b的值居然就是foo.c中結(jié)構(gòu)體第一個(gè)成員變量b.a的值,這證實(shí)了前面的推斷——即便存在多次定義,內(nèi)存中只有一份初始化的拷貝。另外在這里c是置身事外的一個(gè)獨(dú)立變量。

為何會(huì)這樣呢?這涉及到C編譯器對(duì)多重定義的全局符號(hào)的解析和鏈接。在編譯階段,編譯器將全局符號(hào)信息隱含地編碼在可重定位目標(biāo)文件的符號(hào)表里。這里有個(gè)“強(qiáng)符號(hào)(strong)”和“弱符號(hào)(weak)”的概念——前者指的是定義并且初始化了的變量,比如foo.c里的結(jié)構(gòu)體b,后者指的是未定義或者定義但未初始化的變量,比如main.c里的整型b和c,還有兩個(gè)源文件都包含頭文件里的a。當(dāng)符號(hào)被多重定義時(shí),GNU鏈接器(ld)使用以下規(guī)則決議:

  • 不允許出現(xiàn)多個(gè)相同強(qiáng)符號(hào)。
  • 如果有一個(gè)強(qiáng)符號(hào)和多個(gè)弱符號(hào),則選擇強(qiáng)符號(hào)。
  • 如果有多個(gè)弱符號(hào),那么先決議到size最大的那個(gè),如果同樣大小,則按照鏈接順序選擇第一個(gè)。

像上面這個(gè)例子中,全局變量a和b存在重復(fù)定義。如果我們將main.c中的b初始化賦值,那么就存在兩個(gè)強(qiáng)符號(hào)而違反了規(guī)則一,編譯器報(bào)錯(cuò)。如果 滿足規(guī)則二,則僅僅提出警告,實(shí)際運(yùn)行時(shí)決議的是foo.c中的強(qiáng)符號(hào)。而變量a都是弱符號(hào),所以只選擇一個(gè)(按照目標(biāo)文件鏈接時(shí)的順序)。

事實(shí)上,這種規(guī)則是C語言里的一個(gè)大坑,編譯器對(duì)這種全局變量多重定義的“縱容”很可能會(huì)無端修改某個(gè)變量,導(dǎo)致程序不確定行為。如果你還沒有意識(shí)到事態(tài)嚴(yán)重性,我再舉個(gè)例子。

#p#

第二個(gè)例子

  1. /* foo.c */ 
  2. #include <stdio.h>; 
  3.   
  4. struct { 
  5.     int a; 
  6.     int b; 
  7. } b = { 2, 4 }; 
  8.   
  9. int main(); 
  10.   
  11. void foo() 
  12.     printf("foo:\t(&b)=0x%08x\n\tsizeof(b)=%d\n 
  13.         \tb.a=%d\n\tb.b=%d\n\tmain:0x%08x\n", 
  14.         &b, sizeof b, b.a, b.b, main); 
  15.   
  16. /* main.c */ 
  17. #include <stdio.h> 
  18.   
  19. int b; 
  20. int c; 
  21.   
  22. int main() 
  23.     if (0 == fork()) { 
  24.         sleep(1); 
  25.         b = 1; 
  26.         printf("child:\tsleep(1)\n\t(&b):0x%08x\n 
  27.             \t(&c)=0x%08x\n\tsizeof(b)=%d\n\tset b=%d\n\tc=%d\n", 
  28.             &b, &c, sizeof b, b, c); 
  29.         foo(); 
  30.     } else { 
  31.         foo(); 
  32.         printf("parent:\t(&b)=0x%08x\n\t(&c)=0x%08x\n 
  33.             \tsizeof(b)=%d\n\tb=%d\n\tc=%d\n\twait child...\n", 
  34.             &b, &c, sizeof b, b, c); 
  35.         wait(-1); 
  36.         printf("parent:\tchild over\n\t(&b)=0x%08x\n 
  37.             \t(&c)=0x%08x\n\tsizeof(b)=%d\n\tb=%d\n\tc=%d\n", 
  38.             &b, &c, sizeof b, b, c); 
  39.     } 
  40.     return 0; 

運(yùn)行情況如下:

  1. foo:    (&b)=0x0804a020 
  2.     sizeof(b)=8 
  3.     b.a=2 
  4.     b.b=4 
  5.     main:0x080484c8 
  6. parent: (&b)=0x0804a020 
  7.     (&c)=0x0804a034 
  8.     sizeof(b)=4 
  9.     b=2 
  10.     c=0 
  11.     wait child... 
  12. child:  sleep(1) 
  13.     (&b):0x0804a020 
  14.     (&c)=0x0804a034 
  15.     sizeof(b)=4 
  16.     set b=1 
  17.     c=0 
  18. foo:    (&b)=0x0804a020 
  19.     sizeof(b)=8 
  20.     b.a=1 
  21.     b.b=4 
  22.     main:0x080484c8 
  23. parent: child over 
  24.     (&b)=0x0804a020 
  25.     (&c)=0x0804a034 
  26.     sizeof(b)=4 
  27.     b=2 
  28.     c=0 

(說明一點(diǎn),運(yùn)行情況是直接輸出到stdout的打印,筆者曾經(jīng)將./test輸出重定向到log中,結(jié)果發(fā)現(xiàn)打印的執(zhí)行序列不一致,所以采用默認(rèn)輸出。)

這是一個(gè)多進(jìn)程環(huán)境,首先我們看到無論父進(jìn)程還是子進(jìn)程,main.c還是foo.c,全局變量b和c的地址仍然是一致的(當(dāng)然只是個(gè)邏輯地址),而且對(duì)b的大小不同模塊仍然有不同的決議。這里值得注意的是,我們在子進(jìn)程中對(duì)變量b進(jìn)行賦值動(dòng)作,從此子進(jìn)程本身包括foo()調(diào)用中,整型b以及結(jié)構(gòu)體成員b.a的值都是1,而父進(jìn)程中整型b和結(jié)構(gòu)體成員b.a的值仍是2,但它們顯示的邏輯地址仍是一致的。

個(gè)人認(rèn)為可以這樣解釋,fork創(chuàng)建新進(jìn)程時(shí),子進(jìn)程獲得了父進(jìn)程上下文“鏡像”(自然包括全局變量),虛擬地址相同但屬于不同的進(jìn)程空間,而且此時(shí)真正映射的物理地址中只有一份拷貝,所以b的值是相同的(都是2)。隨后子進(jìn)程對(duì)b改寫,觸發(fā)了操作系統(tǒng)的寫時(shí)拷貝(copy on write)機(jī)制,這時(shí)物理內(nèi)存中才產(chǎn)生真正的兩份拷貝,分別映射到不同進(jìn)程空間的虛擬地址上,但虛擬地址的值本身仍然不變,這對(duì)于應(yīng)用程序來說是透明的,具有隱瞞性。

還有一點(diǎn)值得注意,這個(gè)示例編譯時(shí)沒有出現(xiàn)第一個(gè)示例的警告,即對(duì)變量b的sizeof決議,筆者也不知道為什么,或許是GCC的一個(gè)bug?

#p#

第三個(gè)例子

這個(gè)例子代碼同上一個(gè)一致,只不過我們將foo.c做成一個(gè)靜態(tài)鏈接庫libfoo.a進(jìn)行鏈接,這里只給出Makefile的改動(dòng)。

  1. test: main.o foo.o 
  2.     ar rcs libfoo.a foo.o 
  3.     gcc -static -o test main.o libfoo.a 
  4.   
  5. main.o: main.c 
  6. foo.o: foo.c 
  7.   
  8. clean: 
  9.     rm -f *.o test 

運(yùn)行情況如下:

  1. foo:    (&b)=0x080ca008 
  2.     sizeof(b)=8 
  3.     b.a=2 
  4.     b.b=4 
  5.     main:0x08048250 
  6. parent: (&b)=0x080ca008 
  7.     (&c)=0x080cc084 
  8.     sizeof(b)=4 
  9.     b=2 
  10.     c=0 
  11.     wait child... 
  12. child:  sleep(1) 
  13.     (&b):0x080ca008 
  14.     (&c)=0x080cc084 
  15.     sizeof(b)=4 
  16.     set b=1 
  17.     c=0 
  18. foo:    (&b)=0x080ca008 
  19.     sizeof(b)=8 
  20.     b.a=1 
  21.     b.b=4 
  22.     main:0x08048250 
  23. parent: child over 
  24.     (&b)=0x080ca008 
  25.     (&c)=0x080cc084 
  26.     sizeof(b)=4 
  27.     b=2 
  28.     c=0 

從這個(gè)例子看不出有啥差別,只不過使用靜態(tài)鏈接后,全局變量加載的地址有所改變,b和c的地址之間似乎相隔更遠(yuǎn)了些。不過這次編譯器倒是給出了變量b的sizeof決議警告。

到此為止,有些人可能會(huì)對(duì)上面的例子嗤之以鼻,覺得這不過是列舉了C語言的某些特性而已,算不上黑。有些人認(rèn)為既然如此,對(duì)于一切全局變量要么用 static限死,要么定義同時(shí)初始化,杜絕弱符號(hào),以便在編譯時(shí)報(bào)錯(cuò)檢測出來。只要小心地使用,C語言還是很完美的嘛~對(duì)于抱這樣想法的人,我只想說, 請你在夜深人靜的時(shí)候豎起耳朵仔細(xì)聆聽,你很可能聽到Dennis Richie在九泉之下邪惡的笑聲——不,與其說是嘲笑,不如說是詛咒……

#p#

第四個(gè)例子

  1. /* foo.c */ 
  2. #include <stdio.h> 
  3.   
  4. const struct { 
  5.     int a; 
  6.     int b; 
  7. } b = { 3, 3 }; 
  8.   
  9. int main(); 
  10.   
  11. void foo() 
  12.     b.a = 4; 
  13.     b.b = 4; 
  14.     printf("foo:\t(&b)=0x%08x\n\tsizeof(b)=%d\n 
  15.         \tb.a=%d\n\tb.b=%d\n\tmain:0x%08x\n", 
  16.         &b, sizeof b, b.a, b.b, main); 
  17.   
  18. /* t1.c */ 
  19. #include <stdio.h> 
  20.   
  21. int b = 1; 
  22. int c = 1; 
  23.   
  24. int main() 
  25.     int count = 5; 
  26.     while (count-- > 0) { 
  27.         t2(); 
  28.         foo(); 
  29.         printf("t1:\t(&b)=0x%08x\n\t(&c)=0x%08x\n 
  30.             \tsizeof(b)=%d\n\tb=%d\n\tc=%d\n", 
  31.             &b, &c, sizeof b, b, c); 
  32.         sleep(1); 
  33.     } 
  34.     return 0; 
  35.   
  36. /* t2.c */ 
  37. #include <stdio.h> 
  38.   
  39. int b; 
  40. int c; 
  41.   
  42. int t2() 
  43.     printf("t2:\t(&b)=0x%08x\n\t(&c)=0x%08x\n 
  44.         \tsizeof(b)=%d\n\tb=%d\n\tc=%d\n", 
  45.         &b, &c, sizeof b, b, c); 
  46.     return 0; 

Makefile腳本:

  1. export LD_LIBRARY_PATH:=. 
  2.   
  3. all: test 
  4.     ./test 
  5.   
  6. test: t1.o t2.o 
  7.     gcc -shared -fPIC -o libfoo.so foo.c 
  8.     gcc -o test t1.o t2.o -L. -lfoo 
  9.   
  10. t1.o: t1.c 
  11. t2.o: t2.c 
  12.   
  13. .PHONY:clean 
  14. clean: 
  15.     rm -f *.o *.so test* 

執(zhí)行結(jié)果:

  1. ./test 
  2. t2: (&b)=0x0804a01c 
  3.     (&c)=0x0804a020 
  4.     sizeof(b)=4 
  5.     b=1 
  6.     c=1 
  7. foo:    (&b)=0x0804a01c 
  8.     sizeof(b)=8 
  9.     b.a=4 
  10.     b.b=4 
  11.     main:0x08048564 
  12. t1: (&b)=0x0804a01c 
  13.     (&c)=0x0804a020 
  14.     sizeof(b)=4 
  15.     b=4 
  16.     c=4 
  17. t2: (&b)=0x0804a01c 
  18.     (&c)=0x0804a020 
  19.     sizeof(b)=4 
  20.     b=4 
  21.     c=4 
  22. foo:    (&b)=0x0804a01c 
  23.     sizeof(b)=8 
  24.     b.a=4 
  25.     b.b=4 
  26.     main:0x08048564 
  27. t1: (&b)=0x0804a01c 
  28.     (&c)=0x0804a020 
  29.     sizeof(b)=4 
  30.     b=4 
  31.     c=4 
  32.     ... 

其實(shí)前面幾個(gè)例子只是開胃小菜而已,真正的大坑終于出現(xiàn)了!而且這次編譯器既沒報(bào)錯(cuò)也沒警告,但我們確實(shí)眼睜睜地看到作為main()中強(qiáng)符號(hào)的b 被改寫了,而且一旁的c也“躺槍”了。眼尖的讀者發(fā)現(xiàn),這次foo.c是作為動(dòng)態(tài)鏈接庫運(yùn)行時(shí)加載的,當(dāng)t1第一次調(diào)用t2時(shí),libfoo.so還未加 載,一旦調(diào)用了foo函數(shù),b立馬中彈,而且c的地址居然還相鄰著b,這使得c一同中彈了。不過筆者有些無法解釋這種行為的原因,有種說法是強(qiáng)符號(hào)的全局變量在數(shù)據(jù)段中是連續(xù)分布的(相應(yīng)地弱符號(hào)暫存在.bss段或者符號(hào)表里),或許可以上報(bào)GNU的編譯器開發(fā)小組。

另外筆者嘗試過將t1.c中的b和c定義前面加上const限定詞,編譯器仍然默認(rèn)通過,但程序在main()中第一次調(diào)用foo()時(shí)觸發(fā)了Segment fault異常導(dǎo)致奔潰,在foo.c里使用指針改寫它也一樣。推斷這是GCC對(duì)const常量所在地址啟用了類似操作系統(tǒng)寫保護(hù)機(jī)制,但我無法確定早期版本的GCC是否會(huì)讓這個(gè)const常量被改寫而程序不會(huì)奔潰。

至于volatile關(guān)鍵詞之于全局變量,自測似乎沒有影響。

怎么樣?看了最后一個(gè)例子是否有點(diǎn)“不明覺厲”呢?C語言在你心目中是否還是當(dāng)初那個(gè)“純潔”、“干凈”、“行為一致”的姑娘呢?也許趁著你不注意 的時(shí)候她會(huì)偷偷給你戴頂綠帽,這一切都是通過全局變量,特別在動(dòng)態(tài)鏈接的環(huán)境下,就算全部定義成強(qiáng)符號(hào)仍然無法為編譯器所察覺。而一些IT界“恐怖分子” 也經(jīng)常將惡意代碼包裝成全局變量注入到root權(quán)限下存在漏洞的操作序列中,就像著名的棧溢出攻擊那樣。某一天當(dāng)你傻傻地看著一個(gè)程序出現(xiàn)未定義的行為卻無法定位原因的時(shí)候,請不要忘記Richie大爺那來自九泉之下最深沉的“問候”~

或許有些人會(huì)偷換概念,把這一切歸咎于編譯器和鏈接器身上,認(rèn)為這同語言無關(guān),但我要提醒你,正是編譯/鏈接器的行為支撐了整個(gè)語言的語法和語義。你可以反過來思考一下為何C的胞弟C++推出“命名空間(namespace)”的概念,或者你可以使用其它高級(jí)語言,對(duì)于重定義的全局變量是否能通過編譯這一關(guān)。

所以請時(shí)刻謹(jǐn)記,C是一門很恐怖的語言!

P.S.題外話寫在最后。我無意挑起語言之爭,只是就事論事地去“黑(hack)”一門語言而已,而且要黑就要黑得有理有力有層次,還要帶點(diǎn)娛樂精神。其實(shí)黑一門語言并非什么尖端復(fù)雜的技術(shù),個(gè)人覺得起碼要做到兩點(diǎn):

  • 親自動(dòng)手寫測試程序。動(dòng)手寫測試程序是開發(fā)人員必備的基礎(chǔ)技能,只有現(xiàn)成的代碼才能讓人心服口服,那些只會(huì)停留在口頭上的爭論只能算作cheap hack。
  • 測試程序不能依賴于不成熟的代碼。軟件開發(fā)99%以上的bug都是基于不合格(substandard)開發(fā) 人員導(dǎo)致,這并不能怪罪于語言以及編譯器本身。使用諸如#define TRUE FALSE或者#define NULL 1之類的trick來黑C語言只能證明此人很有娛樂精神而不是真正的”hack value”,拿老北京梨園行當(dāng)里的一句話——“那是下三濫的玩意兒”。

原文鏈接:http://coolshell.cn/articles/10115.html

責(zé)任編輯:陳四芳 來源: 酷殼網(wǎng)
相關(guān)推薦

2022-04-12 11:38:06

C語言全局變量

2022-05-23 07:56:58

C語言嵌入式開發(fā)

2013-07-17 16:16:06

Android全局變量定義全局變量Application

2010-11-12 10:08:55

SQL Server全

2013-07-25 15:15:26

iOS開發(fā)學(xué)習(xí)iOS全局變量

2025-06-03 08:50:00

Static全局變量C 語言

2010-03-09 14:12:55

Python全局變量

2009-12-09 17:07:08

PHP unset全局

2010-02-01 14:28:37

Python全局變量

2009-09-24 09:28:00

Scala講座全局變量scala

2009-11-06 13:28:19

Javascript框

2021-06-09 13:28:40

密碼安全身份認(rèn)證數(shù)據(jù)安全

2013-12-26 14:23:03

定位系統(tǒng)GPS監(jiān)測

2024-05-29 08:49:22

Python全局變量局部變量

2022-02-08 17:39:04

MySQL服務(wù)器存儲(chǔ)

2011-02-25 14:35:00

2018-09-26 06:50:19

2021-06-02 08:33:31

TPCTPC-H系統(tǒng)

2015-01-07 14:41:32

Android全局變量局部變量

2009-12-04 13:14:19

PHP Global變
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

欧美精品三级日韩久久| 欧美国产97人人爽人人喊| 久久久久国产视频| 久久久久久久无码| 国产黄色一区| 亚洲一区二区三区免费视频| 蜜桃传媒视频麻豆第一区免费观看| 国产午夜麻豆影院在线观看| 亚洲激情五月| 亚洲男人天堂2023| 青娱乐国产精品视频| 日本不卡1234视频| 亚洲特黄一级片| 久久99影院| av加勒比在线| 日韩国产在线一| 欧美高清videos高潮hd| 在线小视频你懂的| 超碰成人97| 欧美精品久久久久久久多人混战| 鲁一鲁一鲁一鲁一色| 国产美女福利在线| 久久精品亚洲国产奇米99| 亚洲中国色老太| 一级久久久久久| 亚洲精品社区| 九色精品美女在线| 三级影片在线观看| 国产成人精品999在线观看| 欧美va亚洲va| 日韩视频在线观看一区二区三区| 超碰超碰人人人人精品| 亚洲综合精品自拍| 91免费网站视频| 成人高清免费在线播放| 久久综合色鬼综合色| 91丨九色丨国产| 国产模特av私拍大尺度| 青青草一区二区三区| 日本伊人精品一区二区三区介绍| 久久免费小视频| 午夜亚洲福利| 欧美精品在线免费| a级片在线观看免费| 无码一区二区三区视频| 正在播放亚洲1区| www.av天天| 视频精品在线观看| 亚洲欧美国产另类| 三级黄色片网站| 久久a爱视频| 亚洲精品xxxx| 熟女丰满老熟女熟妇| 欧美三级午夜理伦三级小说| 亚洲成色777777在线观看影院| 99热这里只有精品2| 久久久久久久久成人| 欧美一级久久久| 能看毛片的网站| 2023国产精华国产精品| 日韩免费在线观看| 亚洲最大视频网| 999久久精品| 亚洲国产日韩精品在线| 色婷婷免费视频| 亚洲永久精品唐人导航网址| 亚洲奶大毛多的老太婆| 国产aⅴ激情无码久久久无码| 你懂的视频欧美| 欲色天天网综合久久| 1024在线看片| 久久久久久影院| 欧美精品九九久久| 国产成人免费观看视频 | 成人黄色图片网站| 欧美精品久久久久久久久老牛影院| 亚洲怡红院在线| av综合网站| 亚洲精品综合久久中文字幕| 精品人妻一区二区三区蜜桃视频| 欧美丰满日韩| 欧美激情手机在线视频 | 欧洲猛交xxxx乱大交3| 黄色成人在线网站| 国产成人精品久久| 97人妻精品一区二区三区| 国产精品91一区二区| 精品国产免费一区二区三区| 成人免费黄色网页| 亚洲一区二区三区四区在线观看| 日韩黄色片视频| 日韩午夜视频在线| 日韩av在线一区二区| 日韩一区二区三区四区视频| 欧美va天堂在线| 欧日韩在线观看| 国产又粗又黄又爽| 99国产精品久| 路边理发店露脸熟妇泻火| 9lporm自拍视频区在线| 在线观看视频一区| 久久久久国产免费| 欧美日韩色图| 97成人精品区在线播放| 一级黄色片免费看| 91色九色蝌蚪| 久久99国产精品一区| 亚洲黄色网址| 欧美sm极限捆绑bd| 国产精品综合激情| 性xx色xx综合久久久xx| 91久久久精品| jizz日韩| 精品女厕一区二区三区| 国产大片一区二区三区| 欧美男男gaytwinkfreevideos| 欧美疯狂性受xxxxx另类| 中文字幕一二三四| 久久久99精品免费观看| 加勒比成人在线| 精品国产18久久久久久二百| 亚洲网站在线播放| 亚洲 欧美 日韩 综合| 国产精品综合一区二区三区| 日韩一区国产在线观看| 成人福利av| 亚洲成人黄色网| 91香蕉一区二区三区在线观看 | 看看黄色一级片| 国产欧美一区二区精品久久久| 97在线免费视频| 亚洲欧美黄色片| 亚洲综合丝袜美腿| 91香蕉国产线在线观看| 日韩中文首页| 国产精品入口免费视频一| 精品视频一二区| 日韩欧亚中文在线| 蜜臀av一区二区三区有限公司| 18成人免费观看视频| 99精品国产高清一区二区| 午夜老司机在线观看| 日本道精品一区二区三区| www.中文字幕av| 久久永久免费| 日本一区高清在线视频| 97成人资源| 亚洲欧美在线磁力| 蜜臀尤物一区二区三区直播| 久久久99精品免费观看不卡| 国产xxxxx视频| 国产精品美女久久久久久不卡| 欧美一区第一页| 欧美伦理影视网| 91九色最新地址| 夜夜春很很躁夜夜躁| 免费成人在线网站| 中文字幕制服丝袜在线| 欧美精品影院| 性欧美xxxx视频在线观看| 五月婷婷深深爱| 日韩欧美在线视频观看| 精品无码在线观看| 久久99精品久久久| 97av中文字幕| 久久亚洲道色| 国产999精品久久久| 中文字幕在线免费| 91精品婷婷国产综合久久| 久久久久久久黄色| 久久综合狠狠综合| 国产精品区在线| 中文字幕av亚洲精品一部二部| 国产成人精品自拍| 亚洲最大成人| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 18精品爽视频在线观看| 91影院在线免费观看| 男人女人黄一级| 女同性一区二区三区人了人一| 国产一区二区三区奇米久涩 | 91在线国产电影| 波多野结衣中文字幕久久| 亚洲另类图片色| 国产精品色综合| 舔着乳尖日韩一区| 亚洲欧美日韩第一页| 成人午夜激情视频| 亚洲国产精品三区| 在线精品亚洲| 亚洲一区二区高清视频| 丁香一区二区| 国产日韩欧美电影在线观看| 久草在线视频资源| 色噜噜狠狠色综合网图区| 欧美一区二区黄片| 在线观看91av| 亚洲欧美日韩激情| 伊人色综合久久天天人手人婷| 国产成人无码一区二区在线观看| 黑人精品欧美一区二区蜜桃| 国产女大学生av| 国产精品久久久久久久| 欧美精品尤物在线| 亚洲视频国产精品| 国产日韩欧美视频| 在线视频超级| 欧美激情a在线| 日本美女高清在线观看免费| 日韩国产高清视频在线| 精品国产va久久久久久久| 91精品福利视频| 91午夜视频在线观看| 亚洲一区在线观看网站| 色偷偷男人天堂| 国产丝袜欧美中文另类| 国模无码视频一区| 国产剧情一区二区三区| 在线免费视频a| 久久精品中文| 成年人网站免费视频| 一本一本久久a久久综合精品| 日本高清一区| 精品一区毛片| 精品不卡在线| eeuss国产一区二区三区四区| 成人亲热视频网站| 国产精品天堂蜜av在线播放| 日本精品久久久久久久| 毛片电影在线| 97久久伊人激情网| 丁香花电影在线观看完整版| 美女福利精品视频| dy888亚洲精品一区二区三区| 日韩亚洲综合在线| √天堂资源地址在线官网| 在线成人中文字幕| 啊v视频在线| 一本色道久久88综合日韩精品| 丝袜视频国产在线播放| 亚洲精品福利在线观看| 日韩一级片免费看| 精品国产sm最大网站| 亚洲精品视频91| 亚洲成成品网站| 人妻夜夜爽天天爽| 日韩电影第一页| 少妇无码一区二区三区| 日韩av网站大全| 人成在线免费视频| 亚洲人成网站在线播| 国产精品一级伦理| 神马久久久久久| av网站在线免费看推荐| 久久999免费视频| 俺来也官网欧美久久精品| 久久久亚洲国产| 亚洲精品一区| 国产精品久久久久999| 玖玖精品在线| 147欧美人体大胆444| 88久久精品| 精品无人区一区二区三区竹菊 | 亚洲欧美国产高清va在线播| 国产黄色在线播放| 精品国产一区二区三区久久狼5月| 综合图区亚洲| 97在线看免费观看视频在线观看| 奇米777日韩| 成人免费淫片视频软件| 给我免费播放日韩视频| 免费一区二区三区| 色综合久久网| 奇米777四色影视在线看| 国产亚洲精品v| 校园春色 亚洲色图| 国产成人免费xxxxxxxx| 精品少妇人妻一区二区黑料社区| 欧美韩国日本一区| 欧洲猛交xxxx乱大交3| 天天综合网天天综合色| 最新中文字幕免费| 日韩欧美高清在线| 日本精品专区| 久久亚洲私人国产精品va| 黄色污污视频在线观看| 国产精品国产三级国产专播精品人 | 奶水喷射视频一区| 亚洲自拍第三页| 久久亚洲一级片| 日韩va亚洲va欧美va清高| 午夜久久久久久| 一区二区乱子伦在线播放| 日韩欧美一区二区久久婷婷| 青青九九免费视频在线| 欧美成人中文字幕在线| 韩国久久久久久| 高清免费日韩| 成人激情免费视频| 成年人午夜视频在线观看| 久久www免费人成看片高清| 亚洲视频在线播放免费| 综合在线观看色| 无码任你躁久久久久久久| 欧美v国产在线一区二区三区| 高清美女视频一区| 97久久精品人人澡人人爽缅北| 国产精品伦一区二区| 久久超碰亚洲| 欧美全黄视频| 国内自拍第二页| 国产欧美一区二区三区沐欲| 国产亚洲欧美精品久久久www| 欧美日韩国产天堂| 久久久久国产精品嫩草影院| 欧美大片大片在线播放| 亚洲欧洲二区| 视频在线99re| 亚洲欧美日韩国产综合精品二区 | 欧美 丝袜 自拍 制服 另类| 国产综合久久久久影院| 娇妻被老王脔到高潮失禁视频| 精品国产91久久久| 日韩一级片免费看| 欧美高清视频一区二区| 亚洲青青一区| 亚洲综合首页| 日本aⅴ免费视频一区二区三区| 好吊一区二区三区视频| 亚洲国产日产av| www.com欧美| 欧美大尺度激情区在线播放| 欧美在线一级| 亚洲欧美精品在线观看| 日韩 欧美一区二区三区| 日本一区二区三区网站| 高跟丝袜欧美一区| 天堂在线资源网| 午夜精品一区二区三区在线播放 | 亚洲精品视频免费| 黄在线观看免费网站ktv| 国产伦精品一区二区三区视频黑人 | 香港三日本三级少妇66| 久久久久在线观看| 丁香五月缴情综合网| 久艹视频在线免费观看| 成人国产精品免费网站| 日本特黄一级片| 亚洲精品大尺度| 免费电影日韩网站| 欧美一区二区三区四区夜夜大片| 久久一综合视频| 国产激情av在线| 欧美日韩精品免费观看视频| 久操视频在线观看| 超碰97在线人人| 在线看片日韩| 99久久久久久久久久| 日韩欧美在线免费| 在线免费观看黄色| 91久久久亚洲精品| 狠色狠色综合久久| 久久久久久久久免费看无码| 在线观看日韩电影| 免费黄色在线网站| 成人免费在线看片| 黄色日韩在线| 全黄一级裸体片| 欧美日韩高清一区二区不卡| 黄色成人影院| 国产日韩精品推荐| 日韩国产在线一| 青青草免费av| 国产丝袜一区二区三区| 黄色精品视频网站| 日本免费a视频| 久久久久国产一区二区三区四区 | 一区视频二区视频| 国产精品18久久久久久久久| 亚洲男人第一av| 色偷偷噜噜噜亚洲男人的天堂| 免费观看亚洲天堂| 色综合av综合无码综合网站| 国产精品美女久久久久久久| 亚洲男女视频在线观看| 国产精品福利片| 欧美黄免费看| 亚洲精品成人无码熟妇在线| 欧美精品色一区二区三区| www.超碰在线| 一区二区三区四区视频在线观看 | 手机在线免费看av| 日韩av一区二区三区在线| 国产激情精品久久久第一区二区| 国产三级av片| 久久综合网hezyo| 久久成人高清| 丰满少妇xbxb毛片日本| 欧美午夜寂寞影院| 国产黄大片在线观看|