精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产成人av一区二区三区不卡| 黑人巨大精品| avav在线播放| 欧美性猛交xxxx乱大交3| japanese23hdxxxx日韩| 国产精品亚洲a| 欧美日高清视频| 国产精品18hdxxxⅹ在线| 精品黑人一区二区三区观看时间| 欧美xxxx18性欧美| 欧美日韩岛国| 久久精品视频2| 99蜜桃在线观看免费视频网站| eeuss鲁片一区二区三区在线观看| 国产日本在线| 男人添女人荫蒂免费视频| 日本丶国产丶欧美色综合| 日韩成人综合网| 国产激情视频网站| 色悠悠久久久久| 一本色道久久综合亚洲精品高清 | 天天爱天天做天天操| 亚洲第一福利视频在线| 成人精品高清在线视频| 人妻少妇精品视频一区二区三区| 久久国产精品久久久| 精品一区二区在线观看| 97最新国自产拍视频在线完整在线看| 日本在线xxx| 欧美一卡2卡3卡4卡| 欧美高清视频手机在在线| 无码人妻精品一区二区三区蜜桃91 | 少妇又紧又色又爽又刺激视频| 成人欧美视频在线| 自拍偷拍国产精品| 国产成人精选| 日产精品久久久久久久| 久久综合给合久久狠狠色| 亚洲va在线va天堂| 欧美韩一区二区| 永久免费看片在线播放| 鲁丝一区二区三区免费| 欧美日韩在线一区二区| 欧美777四色影| 亚洲av无码片一区二区三区| 男女激情免费视频| 日韩电影第一页| 欧美亚洲三区| 国产三级在线免费观看| 超碰在线97免费| 日韩视频免费在线观看| 成人国产一区二区三区精品| 91精品韩国| 男人操女人的视频网站| 久久免费视频1| 3d动漫精品啪啪| 免费中文字幕日韩欧美| 国精产品一区| 国产免费看av| 成人乱色短篇合集| 午夜精品久久久久久久99樱桃| 色婷婷久久久| 国产av一区二区三区| 丁香婷婷激情网| 欧美影院久久久| 亚洲欧美日韩在线| 欧美电影免费播放| 韩日视频在线| 久久精品老司机| 成人动漫在线观看视频| 8x福利精品第一导航| 翔田千里一区二区| 免费在线看污片| 欧美精品日韩在线| 久久久com| 亚洲女人被黑人巨大进入al| 99亚偷拍自图区亚洲| 日本一区二区三区视频在线看| 台湾佬中文在线| 少妇性饥渴无码a区免费| 91成人在线播放| 天天av天天翘天天综合网| 欧美精品一卡| 日韩123区| 美女视频久久久| 欧美亚洲视频一区| 久久91亚洲人成电影网站| 亚洲一区二区视频在线| 国产视频久久| 成人国产精品入口免费视频| 在线观看亚洲国产| 日本少妇xxxx软件| 麻豆91av| 欧美大片在线看免费观看| 五月激情综合婷婷| 蜜桃传媒麻豆第一区在线观看| 欧美成人毛片| 国产精品一二三四五区| 亚洲女人在线观看| 99se婷婷在线视频观看| 精品少妇一区二区三区在线播放| 国产乱国产乱300精品| 久久精品亚洲成在人线av网址| 亚洲人视频在线观看| 毛茸茸多毛bbb毛多视频| 欧美日韩亚洲一区二区三区在线观看 | 亚洲一品av免费观看| 国产精品视频yy9299一区| 99免费精品| 日本精品在线中文字幕| 人妻偷人精品一区二区三区| 嘿嘿视频在线观看| 亚洲国产精品久久久久爰色欲| 亚洲精品日韩av| 色综久久综合桃花网| 色狠狠色狠狠综合| 粉嫩av一区二区三区| 欧美一区二区三| 日本在线啊啊| 国产丰满果冻videossex| av网在线播放| 日韩网站在线免费观看| 亚洲sss综合天堂久久| 精品亚洲一区二区三区在线播放 | 青青久久av北条麻妃黑人| 精品无人国产偷自产在线| 欧美日韩国产麻豆| 久久伊人蜜桃av一区二区| 亚洲三级国产| 久久成人福利| 日韩av福利| aaa在线观看| 国产又粗又黄又爽| 永久免费看mv网站入口| 亚洲av毛片在线观看| 椎名由奈jux491在线播放| 国产美女久久精品香蕉69| 亚洲人成五月天| 欧美无乱码久久久免费午夜一区| 中文字幕巨乱亚洲| 国产盗摄一区二区三区| av成人激情| 日韩电影免费在线观看| 成人动态视频| 欧美美女日韩| av黄色在线观看| 亚洲一区二区视频在线播放| 欧美极品aaaaabbbbb| 日本成人在线免费| 欧美a在线视频| 视频一区二区视频| 欧美少妇一区| 国产精品12| 成人做爰www免费看视频网站| 久久久久久久久久久av| 国产亚洲精品美女| 欧美大片一区二区| 欧美在线小视频| 亚洲午夜在线电影| 国产婷婷色一区二区三区四区 | 日韩一区二区视频在线观看| 香蕉久久一区二区不卡无毒影院 | 一本久道久久综合狠狠爱| 小小影院久久| 欧美69wwwcom| 午夜精品亚洲| 一区二区不卡| 日本a口亚洲| 国产一区二区三区四区五区| 高清精品视频| 国产va免费精品观看精品| 欧美片第1页| 依依综合在线| 欧美大电影免费观看| 欧美a级在线观看| 性欧美1819sex性高清| 女生影院久久| 日韩美女在线| 欧美性aaa| 亚洲伦理网站| 精品国产一级| 国产精品视屏| 国产在线播放精品| 免费成人蒂法| 久久不卡国产精品一区二区| 国产精品免费大片| 天天久久综合| 伊人久久亚洲美女图片| 在线亚洲成人| 日韩黄色小视频| 久久精品国产99久久6| 青青草成人在线观看| 九九久久精品视频| 国产精品一区一区三区| 久久久综合九色合综国产精品| 中文字幕视频一区二区三区久| 亚洲亚洲精品在线观看| 色狠狠色狠狠综合| 日韩欧美一级二级| 亚洲日韩欧美视频| 欧美国产在线视频| 国产精品日韩一区| 国产传媒欧美日韩| 日韩欧美视频一区二区三区四区| 亚洲欧洲日韩综合二区| 久久精品.com| 91人人澡人人爽| 狂野欧美性猛交| 日韩中文字幕在线观看视频| 中日精品一色哟哟| 日本ー区在线视频| 蜜桃成人365av| 亚洲人成777| 一区二区导航| 日韩视频不卡| 久久综合网色—综合色88| 亚洲国产欧美日韩另类综合| 欧美丰满少妇xxxbbb| 日韩在线www| 国产裸体写真av一区二区| 蜜桃传媒视频麻豆第一区免费观看| www.激情网| 黄大色黄女片18第一次| 30一40一50老女人毛片| 五月激情六月丁香| 日韩一区二区三区中文字幕| 51漫画成人app入口| 久草在线综合| a91a精品视频在线观看| av电影天堂一区二区在线| 午夜久久久久久电影| 精品国产91洋老外米糕| 久久福利视频导航| 97se亚洲综合在线| 加勒比成人在线| 欧美bbbbb性bbbbb视频| av黄色在线播放| 国产精品久久一区二区三区不卡| 日本一道高清亚洲日美韩| 欧美亚洲精品在线| 激情综合一区二区三区| 亚洲免费视频成人| 欧美大片在线观看| 国产精品第一第二| 日本黄色片一级片| 色噜噜日韩精品欧美一区二区| 成人午夜精品视频| 秋霞成人影院| 8848成人影院| 日韩va欧美va亚洲va久久| 亚洲人一二三区| 精品国产一区二区三区久久久狼| 国产精品乱子乱xxxx| 色综合天天色综合| 18精品爽视频在线观看| 日本电影在线观看网站| 精品资源在线| 国产成人在线视频网址| 红桃视频成人在线观看| 久久亚洲国产精品| 奇米视频888战线精品播放| 色偷偷中文字幕| 日本妇乱大交xxxxx| 麻豆mv在线看| 亚洲小说区图片区| 亚洲免费观看在线观看| 国产午夜精品免费一区二区三区 | 亚洲aa在线| 国产日韩综合av| 亚洲欧美国产制服动漫| 久久国产精品-国产精品| 成人免费看片载| 在线视频欧美亚洲| 久久99成人| 粉嫩一区二区三区在线看| 欧美日韩国产欧美日美国产精品| 国产精品男女猛烈高潮激情| 在线能看的av网站| 国产精品无码天天爽视频| 亚洲爽爆av| 高清久久久久久| 精品盗摄一区二区三区| 久久亚洲高清| 在线观看国产网站| 欧美成人高清在线| 激情久久久久久久| 黑人巨大精品欧美一区免费视频| 欧美在线一区二区视频| 黄色在线视频网| 黄色一级a毛片| 欧美日韩伦理在线免费| 久久免费精品国产久精品久久久久| 亚洲欧美中文字幕| 久久久久久久久影视| 免费视频一二三区| 色在线视频观看| 久久国产麻豆精品| 亚洲精品影视在线观看| 吴梦梦av在线| 瑟瑟视频在线免费观看| 欧美影院天天5g天天爽| 亚洲人成伊人成综合网小说| 欧美激情亚洲精品| 日韩视频第二页| 亚洲av无码片一区二区三区| 国产尤物久久久| 亚洲成人久久影院| y111111国产精品久久婷婷| 久操视频在线观看免费| 国产福利在线免费观看| 精品一区二区三区久久| 亚洲香蕉av在线一区二区三区| 小泽玛利亚av在线| 91精品国自产| 伊人久久大香线| 在线播放91灌醉迷j高跟美女| 久久久久久久有限公司| 久久综合加勒比| 日韩在线观看一区二区三区| 国产精品精品国产色婷婷| 国产欧美va欧美va香蕉在线| 精品无码国产污污污免费网站| 中文字幕在线视频网站| 2024国产精品| 欧美一级淫片videoshd| 特级特黄刘亦菲aaa级| 欧美xxxx做受欧美88bbw| 成人免费视频一区| 7777免费精品视频| 日韩网站在线播放| av成人在线播放| 日韩一区在线看| 亚洲va男人天堂| 久久久精品人妻一区二区三区四| 激情视频极品美女日韩| 欧美特级www| 日韩视频在线播放| 国产欧美日韩成人| 亚洲国产一区二区三区a毛片| 亚洲国产精品成人va在线观看| 国精产品一区一区三区视频| 日韩永久免费视频| 热久久免费视频| 久久久久久亚洲精品不卡| 女优一区二区三区| 亚洲成人三级| 亚洲欧美日韩中文视频| 国产一级二级三级在线观看| 久久久噜噜噜久噜久久| 成人精品视频在线观看| 欧美亚洲精品日韩| 久久动漫亚洲| 亚洲国产综合视频| 亚洲成人动漫一区| 亚洲AV无码一区二区三区性| 久久亚洲精品毛片| 国产精品99久久免费| 中文字幕一区二区三区在线乱码| 免费观看日韩av| 日韩av毛片在线观看| 欧美老年两性高潮| 99在线播放| 成人看片在线| 国产欧美91| 美女被到爽高潮视频| 91国在线观看| 亚洲成人三级| 波多野结衣一区二区三区在线观看| 亚洲婷婷在线| 欧美成人午夜精品免费| 91久久香蕉国产日韩欧美9色| 99riav在线| 成人永久免费| 美女视频一区免费观看| 能直接看的av| 日韩欧美一级二级| 欧美日韩美女| 欧美三级午夜理伦三级老人| 成人在线综合网站| 天堂中文字幕在线观看| 在线电影欧美日韩一区二区私密| 日韩亚洲国产免费| 日本一本中文字幕| 国产丝袜欧美中文另类| 国产日本精品视频| 亚洲91精品在线| 成人vr资源| 97中文字幕在线观看| 色偷偷88欧美精品久久久| 国产三区视频在线观看| 国产一区二区在线观看免费播放| 久热国产精品| 免费网站看av| 中文字幕久热精品在线视频| 91精品导航| 亚洲精品自拍网| 午夜视频在线观看一区二区| av在线播放免费| 国内精品一区二区| 国产一区亚洲一区|