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

一例 Go 編譯器代碼優化 bug 定位和修復解析

開發 前端
本文中介紹了 Go 編譯器的整體編譯流程脈絡和一個編譯優化錯誤導致數據越界訪問的 bug,并分析了對這個 bug 的排查和修復過程,希望能夠借此讓大家對 Go 編譯器有更多的了解,在遇到類似問題時有排查思路。

摘要

本文中介紹了 Go 編譯器的整體編譯流程脈絡和一個編譯優化錯誤導致數據越界訪問的 bug,并分析了對這個 bug 的排查和修復過程,希望能夠借此讓大家對 Go 編譯器有更多的了解,在遇到類似問題時有排查思路。

緣起

某日,一位友人在群里招呼我,“看到有人給 Go 提了個編譯器的 bug,挺有意思,感覺還挺嚴重的,要不要來看看?”于是我打開了 issue 40367[1] 。彼時,最新一條評論是 這條[2] :

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

提到將循環體中的一個常數從 1 改成 2 就無法復現問題,這頓時勾起了我的興趣,于是我準備研究一番。

bug 代碼跟現象如下圖,正常來看,代碼應該在輸出 "5 6" 后停止,然而實際上卻無限執行了下去,只能強行終止或等待程序觸碰到無權限內存地址之后崩潰。

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

首先,我們要定位到這個問題具體的直接原因。簡單來說,這個 bug 是 for-range loop 越界,原本循環應該在循環次數到達數組長度后終止,但是這個復現程序中的循環無限執行了下去。乍一看,問題像是有 bound check 被優化掉了,那么我們來實錘一下。有一個方便的網站,可以在線觀察給定程序編譯產出的匯編結果,我用 這個網站[3] 分別生成了原復現程序和將第六行的 +1 改為 +2 后不復現程序的匯編,供大家對比。拋開無關細節不提,可以很容易地看到前者的匯編相較于后者的確少了一次判斷,導致循環無法終止,具體的位置是第二段代碼的 105 行:

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

既然直接原因已經定位到了,那接下來我們就要想辦法追進編譯器來查看為什么匯編結果有問題了。對很多同學來說,追進編譯器查問題的過程可能比較陌生,聽起來就令人望而卻步,那么我們如何來排查這個問題呢?

背景知識

在追蹤這個具體問題之前,我們需要先了解一些相關知識背景。

Go 編譯器的大體運行流程

想要追查 Go 編譯器的問題,首先就需要了解 Go 編譯器的大致運行流程。其實 Go 的編譯器的實現中規中矩,相比于 GCC/Clang 等老牌編譯器甚至有些簡陋,許多優化并未實現。一個 Go 程序在生成匯編前的工作大概分為這幾步:

語法解析。由于 Go 語言語法相當簡單,所以 Go 編譯器使用的是一個手寫的 LALR (1) 解析器,這部分跟今天的 bug 無關,細節略過不提。

類型檢查。Go 是強類型靜態類型語言,在編譯期會對賦值、函數調用等過程做類型檢查,判斷程序是否合法。另外,這個步驟會將一些 Go 自帶的泛型函數變換成具體類型的函數調用,比方說 make 函數,在類型檢查階段會根據類型檢查的結果變換成具體的 makeslice/makemap 等。這部分也跟今天的 bug 無關。

中間代碼 (IR)生成。為方便做跨平臺代碼生成,也為方便做編譯優化,現代編譯器通常會將語法樹變成一個中間代碼表示形式,這個表示形式的抽象程度通常是介于語法樹和平臺匯編之間。Go 選擇的是一種靜態單賦值 (SSA)形式的中間代碼。這部分較為重要,接下來一個小節會展開詳述一下。

編譯優化。在生成了 SSA IR 之后,編譯器會基于這個 IR 跑很多趟(pass)代碼分析和改寫,每個 pass 會完成一個優化策略。另外值得一提的是,Go 中很多強度削減類的策略是使用一種 DSL 描述,然后代碼生成出實際的 pass 代碼來的,不過這塊跟今天內容沒什么關系,感興趣的同學可以下來看看。在文章的后續內容中,我們就會定位到導致本文中這個 bug 的具體的 pass,并看到那個 pass 中有問題的邏輯。

這幾步之后,編譯器就已經準備好生成最終的平臺匯編代碼了。

靜態單賦值形式

靜態單賦值的含義是,在這種類型的 IR 中,每一個變量只會被賦值一次。這種形式的好處我們不再贅述,僅以一段簡單的 Go 代碼作為實例幫助大家理解 SSA IR 的含義。

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

這里是一個簡單的例子,右側是 Go 代碼所對應的 SSA IR。可以看到,整個代碼被切分成了多塊,每個代碼塊 (block)的代碼以 bXX 作為開頭,另外在縮進所對應的結尾能夠看到這個 block 會跳轉到哪個 block。在 block 內部,可以看到包括常量在內的每個值都會有一個單獨的名字,比如變量 a 在 Go 代碼的 4、5 行的兩次賦值,在 SSA IR 中對應了 v7 和 v11 兩個值。

但是,如果是代碼中包含了 if 等語句,在編譯時不能確定需要使用哪個值,在 SSA IR 中如何表示呢?例子中正好有這樣的代碼,可以看到 Go 代碼中第六行的 if。實際上,SSA IR 中有一個專門的 phi 操作符,就是為了這種情況設計,phi 操作符的含義是,返回值可能是參數的多個值中的任意一個,但是具體究竟是哪個值,需要取決于這個 block 此次運行是從哪個 block 跳轉而來。在上圖中,可以看到 b2 就有一個 phi 運算符,v22 可能等于 v11 或 v21,具體等于哪個值需要看 b2 的上一個塊究竟是 b1 還是 b3,實際上就對應了 if 條件的成立或不成立。當然,這個例子中 if 顯然成立,只不過我們這里看到的 SSA IR 是未經過優化的 IR,在實際的編譯過程中,這里會被優化掉。

Go 編譯器提供了非常方便的功能,可以查看各個優化 pass 前后的 SSA IR,只需要在編譯時,增加一個 GOSSAFUNC=xxx 環境變量即可,xxx 即為想要分析的函數的名字,因為 Go 編譯器內部的優化都是函數級別的。比如上圖的例子,只需要運行 GOSSAFUNC=main go build ssaexample.go,編譯器就會將 SSA IR 結果輸出到當前目錄的 ssa.html 中,用瀏覽器打開即可。

排查過程

追查出問題的優化策略

了解了這么多前置知識,我們終于可以來追查這個具體的 bug 成因了。第一步,我們要首先通過 Go 編譯器 dump 出來的 SSA IR,查看究竟是哪一個 pass 出了問題。用上一節中講到的方式,我們可以觀察 issue 中的復現程序的所有 SSA IR。由于 Go 編譯器的優化 pass 不少,所以在 ssa.html 中記錄了大量的 SSA IR,我們如何找到有問題的 pass 呢。對于我個人來說,由于我之前有所了解,能夠大致猜到這種問題是 prove pass 的 bug。但是即使大家沒有相關背景,由于我們已經知道這個 bug 的直接原因是少了一條比較判斷,所以也可以通過二分法查看哪個 pass 少了一條比較指令來進行定位。需要注意的是,大家可能會定位到 generic deadcode pass,因為這個 pass 中少了一條 Less64 指令,如圖(我這里使用的是 Go 1.15rc1,具體輸出與編譯器版本相關,可能有所不同),右側是 generic deadcode pass:

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

可以看到相比于左側,右側中 b4 里的 Less64 消失了,再觀察這條 Less64 的參數,v11 就是常量 6,也即代碼中數組的長度,可以確定這條指令就是那個消失的邊界判斷。那么我們是否可以確定 bug 出在 generic deadcode pass 呢?并不能。因為這個 pass 只是把前面 pass 中已經變成死代碼的部分刪除掉,實際上這行 Less64 在前面已經變成死代碼了,從左側這條指令的淺灰色可以看出來,也就是說 generic deadcode pass 其實是背鍋的。不過從這里開始,往前查具體是哪個 pass 變成的死代碼,就容易很多了,只需要在瀏覽器中點擊這行指令,就能將這條指令的變遷高亮出來,往前追幾個 pass 很容易看到是 prove pass 出了問題:

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

右側是 prove pass,可以看到這行在 prove pass 變成了灰色。

prove pass 簡介

定位了出問題的策略是 prove pass,那么接下來我們就需要看看 prove pass 究竟是干什么用的。實際上,prove pass 的功能是對全局中 SSA 值的取值范圍做一個推斷,這樣就可以消除掉許多不必要的分支判斷,是不是聽起來就跟今天的 bug 脫不了干系?實際上,這是在 Go 編譯器中非常重要的一個 pass,很多優化都依賴于這個 pass 之后得到的結果。比如,由于 Go 是內存安全的語言,所以所有的 slice 取元素操作都需要做一個檢查,來判斷取元素用的下標是否超出了 slice 的范圍,這個操作叫做 bound check。但是實際上,很多代碼中在編譯期就能確定這個下標是否越界,那么我們就可以將原本需要在運行期做 bound check 的檢查給消除掉,這步優化叫做 bound check elimination,具體代碼示例比如下面這段,是從 Go 標準庫[4] 拿來的代碼:

 

  1. func (bigEndian) PutUint64(b []byte, v uint64) { 
  2.  _ = b[7] // early bounds check to guarantee safety of writes below 
  3.  b[0] = byte(v >> 56) 
  4.  b[1] = byte(v >> 48) 
  5.  b[2] = byte(v >> 40) 
  6.  b[3] = byte(v >> 32) 
  7.  b[4] = byte(v >> 24) 
  8.  b[5] = byte(v >> 16) 
  9.  b[6] = byte(v >> 8) 
  10.  b[7] = byte(v) 

可以看到,這個函數中首先進行了 b[7] 的操作,這樣一來,編譯器在 prove pass 就可以了解到,當程序運行到第三行及之后時,slice b 的長度是必然大于等于 7 的,因此后續操作的 bound check 都可以被 eliminate 掉。 但是,prove pass 不止會做 bound check elimination 這一個特定 pattern 的優化,還有許多其他 pattern 也會在 prove pass 被優化掉。那么今天的這個 bug 究竟是 prove pass 中什么地方出了問題呢?

prove pass 問題排查

說起代碼問題的定位方法,可能大體上能夠分成三個流派。第一是打日志,通過在日志中加信息來定位問題;第二是通過 gdb 等 debugger 下斷點、單步運行來排查問題;第三是動態追蹤,通過 perf/systemtap/ebpf 之類的手段來動態觀測程序運行時的行為。具體到 Go 編譯器這里,其實開發 Go 編譯器的 Go team 大牛們也需要日常排查問題,也不外乎這幾種手段,但是在編譯優化的問題上他們更青睞第一種打日志的方式,所以他們已經在各個 pass 中預埋了許多 debug 日志,只是這些日志平常不會開啟,需要特殊的編譯開關。既然 prove pass 相當復雜,我們不妨通過查日志的方式來進一步縮小問題排查范圍。prove pass 的 debug 日志開關是 -d=ssa/prove/debug=1,其中 debug 后面跟的數字越大日志越詳細,我們只需要在編譯時執行 go tool compile -d=ssa/prove/debug=1 bug.go 就能看到對應的日志。具體到這個 bug,用 debug=1 的級別能夠看到對比。如下圖,左側為復現程序的日志,右側為修改常量后不復現的程序的日志:

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

可以很清楚地看到,bug 程序明顯多證出了一個關系。進一步地,通過 grep 編譯器代碼中這段日志關鍵詞,就能找到只有 findIndVar 和 addLocalInductiveFacts 這兩個函數中會打這條日志,結合上下文和相關注釋不難看出實際上問題是出在 addLocalInductiveFacts 這個函數上。addLocalInductiveFacts 具體是什么功能呢?從注釋中不難看出,這里的功能是匹配到一種特殊的代碼 pattern,即類似 repeat until 的邏輯,在循環末尾判斷某個條件是否成立。具體這個函數中的 bug 出在何處,我們還需要進一步用更高級別的 debug=3 來看其運行細節:

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

我這里只截到了相關日志部分。能看到,在出問題的 induction 之前,首先證得了 v10 >= v16 不成立。結合 addLocalInductiveFacts 可以發現,實際上編譯器是將 v10 和 v16 分別當作了循環變量的上下界,也就是代碼中的 min 和 max 變量。但是,結合 SSA IR 不難看出,其實 v16 根本不是循環變量的上界,那么問題究竟出在哪呢?

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

讀 addLocalInductiveFacts 的 抽取 max 的相關代碼[5](如上圖片段)可以看出,這里的意圖其實就是從條件判斷結束后循環頭部的 phi 操作所在 block 出發,一路向前追溯,找到條件判斷的 block(if block),然后如代碼中 1104 行,判斷 phi 操作究竟是 if 的條件成立分支邏輯,還是 else 邏輯,根據分支來判斷是否應當對條件進行取反,因為如果是 else 分支邏輯,那么意味著條件判斷結果是 false,我們需要對條件取反才能得到真正成立的邏輯條件。看到這里的代碼,相信大家已經知道了這個 bug 的根因所在。1104-1113 行代碼寫的很清楚,如果是條件成立分支,那么 br 為 positive,如果是 else 分支,那么 br 為 negative。但是,這里并沒有判斷 phi 操作跟 if block 的間接關聯,如果 phi 操作跟 if block 沒有直接聯系,那么即使我們追溯到了 if block,也沒法知道 br 變量究竟是 positive 還是 negative,取值就是 unknown。但是在后續邏輯中,并沒有判斷 unknown,而是直接默認按照 positive 的流程走;恰好在這個 bug 復現程序中,phi 操作所在 block 跟 if block 的 else 分支有間接關聯,走 positive 流程自然就出了問題。

 

一例 Go 編譯器代碼優化 bug 定位和修復解析

上圖為問題復現代碼的 ssa cfg 圖,能夠清楚地看出,b6 沒有與對應的 b5 有直接關聯,而是間接關聯,命中了代碼的錯誤路徑。

結尾

定位到了問題,那么如何修復呢?一個很簡單的方式,就是直接在 br 求值的邏輯后面,增加一個 unknown 判斷邏輯,當 br == unknown 就直接退出判斷。這樣一來,prove pass 顯然會變得保守,但是可以保證正確性。加了這個檢查之后 bug 復現程序就運行正常了,但是作為更加 general 的修復,我們在函數的入口處增加對入口 block 的判斷,確保入口 block 的確是一個循環開頭塊,而不是什么別的恰好也能匹配上當前 pattern 的東西。我將這個修復提交給了上游。這個 bug 由于非常嚴重,而且這個修復對性能實測基本沒有太大影響,所以很快合入了 master,即 commit 7f8608047644ca34bad1728d5e2dbef041a1b3f2[6] ,并且將要 cherry pick 到仍然承諾維護的前兩個大版本 1.13 和 1.14 中。前面提到,這個 patch 會讓優化器更加保守,所以后續會通過其他修改讓優化器恢復到之前的水平,我也已經提交了對應的 patch,不過由于 1.15 開發周期已經凍結,所以預計會在 1.16 cycle 合入 master。

相信大家通過本文已經對 Go 編譯器的運行過程、定位 bug 的一些方式有了基本的了解。可能大家已經注意到,開頭我提到這個 bug 的復現程序在修改一個常數為 2 之后就不再復現,那到底是什么原因導致修改常數之后就不復現了呢?相信細心的你經過研究之后知道了答案。Happy hacking ;-)

責任編輯:未麗燕 來源: 今日頭條
相關推薦

2011-07-20 16:43:33

iPhone Bug Xcode

2023-11-15 17:58:58

C++代碼

2021-07-06 12:07:27

Go 服務性能

2013-12-30 11:21:31

Go編譯器

2011-05-18 11:06:25

java編譯器

2010-09-16 15:57:25

Java編譯器

2023-04-14 10:40:45

工具編譯器優化

2019-06-14 08:35:14

華為禁令開發

2021-10-09 12:08:23

Facebook編譯器機器學習

2022-02-23 13:31:26

RVO編譯器優化

2023-03-26 20:39:01

2021-09-06 07:59:13

Go編譯器語言

2023-09-25 08:08:56

CAA開發者團隊

2009-11-26 15:50:06

VS2003編譯器

2010-01-13 17:12:26

C++編譯器

2009-05-05 09:55:10

Javastring對象

2022-08-02 08:11:41

監控埋點埋點方式插樁

2020-04-02 15:39:51

代碼編譯器前端

2012-05-17 09:26:43

MapReduce

2012-09-24 01:01:49

NginxNginx性能Web服務器
點贊
收藏

51CTO技術棧公眾號

日本免费在线视频| 中国女人真人一级毛片| 亚洲综合小说图片| 欧美日韩不卡在线| 欧美不卡在线播放| www.中文字幕久久久| 国产精品综合二区| 日本成人激情视频| 中文字幕av播放| 亚洲专区视频| 日韩视频在线你懂得| 欧美v在线观看| 羞羞的网站在线观看| 国产亚洲污的网站| 狠狠色综合色区| 91tv国产成人福利| 蜜桃视频一区| 久久理论片午夜琪琪电影网| 欧美xxxooo| 视频一区中文| 亚洲国产精品久久| 初高中福利视频网站| 国产成人a视频高清在线观看| 亚洲午夜在线视频| 亚洲精品偷拍视频| 在线免费观看的av网站| 久久亚洲影视婷婷| 国产偷国产偷亚洲高清97cao| 中文字幕在线观看高清| 国产欧美亚洲一区| 久久久久久久久久久网站| 黄色a级片在线观看| 成人3d动漫在线观看| 精品亚洲一区二区| 亚洲av成人片无码| 51精品国产| 欧美一区二区三区的| 亚洲美女爱爱视频| 成人激情综合| 一本大道av伊人久久综合| 亚洲熟妇无码另类久久久| 国模雨婷捆绑高清在线| 一区二区三区四区乱视频| 最新精品视频| 黄色大片在线播放| 亚洲猫色日本管| 一本色道久久综合亚洲精品婷婷| av基地在线| 国产精品区一区二区三区| 日韩欧美一区二区三区四区五区 | 日本午夜小视频| 欧美午夜精品| 欧美激情精品久久久久久蜜臀 | 在线免费观看日本欧美| 日韩中文字幕二区| 欧美韩国亚洲| 欧美系列在线观看| 国内外成人免费在线视频| 久久青草视频| 欧美一区二区三区视频免费播放| 亚洲另类第一页| 99精品国产九九国产精品| 欧美高清dvd| 三上悠亚 电影| 国产精品巨作av| 国产视频欧美视频| 国产18无套直看片| 外国成人激情视频| 欧美二区乱c黑人| 黄色一级片免费看| 三级亚洲高清视频| 91精品国产自产在线老师啪| 97国产精品久久久| 国产99精品国产| 久久精品二区| 在线a人片免费观看视频| 亚洲精品欧美专区| 久色视频在线播放| 日本综合视频| 欧美一卡二卡三卡| 欧美bbbbb性bbbbb视频| 99欧美视频| 欧美激情久久久久久| 国产成人精品片| 久久99国产精品免费网站| 成人在线观看av| 久久久资源网| 亚洲欧美激情小说另类| 3d动漫一区二区三区| 狂野欧美性猛交xxxx| 欧美刺激午夜性久久久久久久| 韩国无码一区二区三区精品| 91视频久久| 91精品国产91久久久| 亚洲自拍偷拍另类| 成人av先锋影音| 亚洲国产高清国产精品| 91九色porn在线资源| 欧美三区在线视频| 91av在线免费| 欧美一区二区三区免费看| 日韩av免费在线观看| 精品国产18久久久久久| 国产日韩欧美电影| 欧美又粗又长又爽做受| 日本免费成人| 精品亚洲永久免费精品| 久久国产精品波多野结衣av| 蜜乳av一区二区三区| 黑人另类av| 性xxxfreexxxx性欧美| 欧美丝袜丝nylons| 无码精品一区二区三区在线播放| 97精品国产| 国产91精品在线播放| 国产乱人乱偷精品视频| 国产婷婷色一区二区三区在线| 日韩精品免费一区| 老司机精品视频网| 一个人www欧美| 青青草免费观看视频| 成人性色生活片免费看爆迷你毛片| 亚洲国产午夜伦理片大全在线观看网站| caoporn视频在线观看| 日韩一区二区三区av| 久久精品在线观看视频| 日韩高清一级片| 久久精品日产第一区二区三区精品版| a毛片在线看免费观看| 欧美日韩国产bt| 亚洲成人黄色av| 久久都是精品| 免费毛片一区二区三区久久久| av剧情在线观看| 精品国产一区二区三区久久久蜜月 | 日本一区二区成人| 欧美日韩大尺度| 精品一区不卡| 国产精品久久久久久久久影视| 日韩精品系列| 日本道色综合久久| av小说在线观看| 久久精品盗摄| 日韩欧美三级电影| 91精品美女| 综合网日日天干夜夜久久| 国产精品21p| 国产日韩综合av| 丰满少妇在线观看| 成人羞羞在线观看网站| 国产精品手机播放| 在线日本视频| 欧美一区二区三区在线视频| 69av视频在线| 成人久久视频在线观看| 国产伦精品一区二区三区四区视频_| 成人高潮a毛片免费观看网站| 欧美精品999| 午夜黄色小视频| 91久久精品一区二区三| 亚洲一区二区自偷自拍| 久久国产精品免费| 男人草女人视频| 国产厕拍一区| 日韩暖暖在线视频| 男人的天堂在线视频免费观看| 91.com在线观看| 久青草视频在线观看| 91蜜桃视频在线| 日本中文字幕高清| 影音先锋成人在线电影| 国产精品区免费视频| 日本黄色免费在线| 这里只有视频精品| 国产a级免费视频| 欧美日韩在线视频观看| 国产又粗又硬视频| 国产成人aaaa| 欧美精品第三页| 亚洲自拍偷拍网| 久久久久久久有限公司| 3d动漫一区二区三区在线观看| 久久久免费精品| 国产一级片在线| 精品嫩草影院久久| 久久久久久久久久一级| 亚洲最新在线观看| 中文字幕在线1| 国产传媒日韩欧美成人| 无遮挡又爽又刺激的视频| 综合亚洲视频| 日韩福利视频| 国产精品毛片视频| 国产又爽又黄的激情精品视频| 大香伊人中文字幕精品| 少妇久久久久久| 深爱五月激情五月| 欧美一区二区三区在线观看| 欧美精品韩国精品| 亚洲一区二区视频在线观看| 男人舔女人下部高潮全视频 | 三上悠亚影音先锋| 国产.欧美.日韩| 蜜臀一区二区三区精品免费视频| 一二三区精品| 男人添女人下部视频免费| 久久国产精品亚洲人一区二区三区 | 久久99热精品这里久久精品| 国产精品视频一区二区久久| 精品国产乱码久久久久久久久| 一级久久久久久久| 日韩欧美第一页| 日本熟妇色xxxxx日本免费看| 成人免费一区二区三区视频| 性猛交娇小69hd| 91在线你懂得| 国产精品扒开腿做爽爽爽a片唱戏| 激情五月播播久久久精品| 亚洲精品高清无码视频| 午夜在线精品偷拍| 男人插女人视频在线观看| 亚洲国产精品久久久久蝴蝶传媒| 日本一区二区久久精品| 亚洲+变态+欧美+另类+精品| 国产精品中出一区二区三区| 欧美久久亚洲| 亚洲一区二区三区乱码aⅴ| 成人国产一区| 国产精品久久色| 国产综合色在线观看| 日韩av大片免费看| 伊人久久综合一区二区| 91国产高清在线| 少妇淫片在线影院| 午夜精品久久久久久久99黑人| 麻豆av在线播放| 九九九热精品免费视频观看网站| av观看在线| 欧美成人免费播放| 日韩三级免费| 性视频1819p久久| gogo高清午夜人体在线| 久久久久久久久久久久av| 日韩伦理电影网站| 午夜精品久久久久久久男人的天堂 | 久久大综合网| 在线观看欧美亚洲| 91精品综合| 国产精品无码免费专区午夜| 欧美视频二区| 5月婷婷6月丁香| 久久蜜桃精品| 中文字幕国内自拍| 久草这里只有精品视频| 中文字幕55页| 暴力调教一区二区三区| 中文字幕狠狠干| 中文字幕精品在线不卡| 中国毛片直接看| 亚洲在线免费播放| 国产高潮久久久| 在线看一区二区| 国产乱色精品成人免费视频| 精品国产污网站| 撸视在线观看免费视频| 中文欧美日本在线资源| 91在线中字| 88国产精品欧美一区二区三区| 成人日韩精品| 成人激情视频在线观看| 国产乱人伦丫前精品视频| 欧洲亚洲一区二区| 亚洲电影在线一区二区三区| 男人添女人下部高潮视频在观看| 久久精品中文| 黑人巨大猛交丰满少妇| 91免费看视频| 欧美做爰啪啪xxxⅹ性| 亚洲成av人片在线| 日韩乱码一区二区三区| 日韩午夜电影av| 亚洲av成人无码久久精品老人| 中文字幕一区日韩电影| 99热国产在线中文| 青青久久av北条麻妃海外网| 欧美一级高清免费播放| 亚洲日本中文| 久久99精品久久久久久青青日本| 日韩啪啪电影网| 131美女爱做视频| 久久av老司机精品网站导航| 99热超碰在线| 国产精品国产a级| 欧美黑人一区二区| 日韩精品最新网址| 搞黄视频免费在线观看| 久久免费少妇高潮久久精品99| 亚洲电影有码| 国产一区二区三区无遮挡| 欧美疯狂party性派对| 自慰无码一区二区三区| 国产精品影视天天线| 五月天综合视频| 五月天亚洲婷婷| 国产裸体无遮挡| 一区二区欧美久久| 蜜桃视频动漫在线播放| 成人自拍性视频| 国产欧美日韩影院| 国产一区二区三区小说| 激情都市一区二区| 免费黄在线观看| 岛国精品视频在线播放| 亚洲精品一区二区三区蜜桃 | 都市激情国产精品| 91九色极品视频| 久久人人99| 一区二区在线播放视频| www久久精品| 国产一级特黄a高潮片| 日韩欧美国产综合| 蜜桃视频网站在线观看| 国产精品精品视频一区二区三区| 欧美亚洲大陆| 日本人体一区二区| 国产精品77777竹菊影视小说| 亚洲一区电影在线观看| 欧美三级韩国三级日本三斤| 黄色av网站在线看| 欧美一级高清免费| 亚洲aaa级| 免费在线激情视频| 91亚洲男人天堂| 午夜精品久久久久久久久久久久久蜜桃| 日韩欧美中文一区二区| 图片区小说区亚洲| 5g国产欧美日韩视频| 一个色综合网| 日韩精品――色哟哟| 亚洲激情自拍视频| 国内爆初菊对白视频| 久久久久日韩精品久久久男男 | 韩国v欧美v亚洲v日本v| 在线免费看视频| 欧美日本精品一区二区三区| 免费网站成人| 亚洲free性xxxx护士白浆| 欧美日本一区二区视频在线观看 | 青草青草久热精品视频在线网站| 日本亚洲不卡| 蜜臀久久99精品久久久酒店新书 | 黄色影视在线观看| 国产剧情一区二区| 最新av网址在线观看| **国产精品| 日本在线视频www色| 国产精品一区二区在线观看网站| 亚洲国产精品久| 亚洲韩国欧洲国产日产av | 亚洲国产成人午夜在线一区| 日本少妇裸体做爰| 亚洲精品ady| 成人黄色免费短视频| 亚洲一区二区不卡视频| 韩国v欧美v日本v亚洲v| 久久久国产成人| 日韩久久免费电影| 成人在线免费av| 粉嫩av一区二区三区天美传媒| 成人黄色777网| 免费观看日批视频| 久热爱精品视频线路一| 国产日韩三级| 午夜久久久精品| 一区二区在线观看免费视频播放 | 欧美视频第一| 亚洲色图都市激情| 97久久精品人人爽人人爽蜜臀| 欧美性受xxx黑人xyx性爽| 麻豆国产va免费精品高清在线| 91精品久久久久久综合五月天| 日本三级免费网站| 国产精品久久一卡二卡| 成人毛片视频免费看| 国产精品免费在线免费 | 日韩a级大片| 在线免费av播放| 亚洲国产欧美在线| 91激情在线| 国产一区精品视频| 久久精品99国产精品| 国产午夜激情视频| 丝袜亚洲另类欧美重口| 久久中文字幕导航| 亚洲理论中文字幕| 欧美性精品220| 里番在线播放| 最新精品视频| 国产视频一区二区在线| 粉嫩av一区二区夜夜嗨|