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

復制粘貼一時爽:傳播最廣的一段Java代碼曝出Bug

新聞 前端
復制粘貼一時爽,頻出 bug 火葬場。對開發者而言,Stack Overflow 和 GitHub 是最為熟悉不過的兩大平臺,這些平臺充斥著大量開源項目信息和解決各類問題的代碼片段。

 復制粘貼一時爽,頻出 bug 火葬場。對開發者而言,Stack Overflow 和 GitHub 是最為熟悉不過的兩大平臺,這些平臺充斥著大量開源項目信息和解決各類問題的代碼片段。最近,一位叫做 Aioobe 的開發者在一項調查中發現了一段自己十年前寫的代碼,這段代碼成為了 Stack Overflow 上復制次數最多、傳播范圍最廣的答案,GitHub 的眾多項目中也存在這段代碼。然而,這位開發者表示這段代碼其實是有 bug 的,并于近日更新了答案并作出說明。

這段代碼是干啥的?

2010 年的時候,我整天泡在 Stack Overflow 上回答問題,希望可以提高自己的知名度。當時,有一個問題吸引了我的注意:如何以人類可讀的格式輸出字節數?舉個例子,將“123456789 字節”轉換為“123.5 MB”的格式輸出。

复制粘贴一时爽:传播最广的一段Java代码曝出Bug

這是現在的截圖,但問題確實是這個

這里的隱含范式在于所得到的字符串值應該在 1 到 999.9 之間,后面再跟上一個大小合適的單位。當時已經有人給了一條回應。答案中的代碼以循環為基礎,基本思路非常簡單:嘗試所有單位,從最大(EB,即 1018 字節)到最小(B,即 1 字節),而后使用一種顯示數量小于實際字節數量的單位。用偽代碼寫出來,基本是這么個意思:

  1. suffixes = [ "EB""PB""TB""GB""MB""kB""B" ]  
  2. magnitudes = [ 101810151012109106103100 ]  
  3. i = 0  
  4. while (i < magnitudes.length && magnitudes[i] > byteCount)  
  5. i++  
  6. printf("%.1f %s", byteCount / magnitudes[i], suffixes[i])  

一般來說,如果發布的正確答案已經獲得了正分數,那后發者很難追上。在 Stack Overflow 上,這就叫“拔槍最快的贏”。不過,我認為這個答案有缺陷,所以準備重新改改。我意識到,無論是 KB、MB 還是 GB,所有單位的本質實際都是 1000 的冪(當然,按 IEC 標準來講是 1024),意味著應該可以使用對數而非循環來計算正確的量級單位。

基于以上思路,我發布了下列內容:

  1. public static String humanReadableByteCount(long bytes, boolean si) { 
  2. int unit = si ? 1000 : 1024
  3. if (bytes < unit) return bytes + " B"
  4. int exp = (int) (Math.log(bytes) / Math.log(unit)); 
  5. String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); 
  6. return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); 

當然,這段代碼可讀性不高,而且 log/pow 也可能在一定程度上影響執行效率,但至少這里沒有循環,幾乎不涉及分支,我覺得還是比較整潔的。

這里面使用的數學方法非常簡單。字節計數表示為 byeCount=1000s , 其中的 s 代表小數點后的位數(以二進制表示,則使用 1024 為基數),求解 s,即可得出 s=log1000(byteCount)。

API 里沒有現成的 log1000 可以直接使用,但我們不妨用自然對數來表示,即 s = log(byteCount) / log(1000)。接下來,我們取 s 的底(即取整數),因為假如我們得出的結果超過 1 MB(但不足 1 GB),則希望繼續使用 MB 作為表示單位。

此時,如果 s=1,則單位為 KB;如果 s=2,則單位為 MB;依此類推,我們將 byteCount 值除以 1000s ,然后取對應的單位。

接下來,我能做的就是等待,看看社區是否喜歡這個答案。那時候的我,絕對想不到它會成為 Stack Overflow 上復制最多的代碼片段。

BUG 在哪?

估計不少人看到這兒肯定在想,這段代碼里到底有什么 bug?再來看一遍代碼:

  1. public static String humanReadableByteCount(long bytes, boolean si) { 
  2. int unit = si ? 1000 : 1024
  3. if (bytes < unit) return bytes + " B"
  4. int exp = (int) (Math.log(bytes) / Math.log(unit)); 
  5. String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp-1) + (si ? "" : "i"); 
  6. return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); 

在 EB,即 1018 之后,接下來的單位應該是 ZB,即 1021。難道是輸入量過大導致“kMGTPE”字符串的索引超出范圍?不是的,long 的最大值是 263 - 1 ≈ 9.2 × 1018,因此任何 long 值都不會超出 EB 范圍。

那么,是 SI 與二進制之間存在混雜嗎?也不是。答案的早期版本中確實有這個問題,但很快就得到了修復。

那么,是不是 exp 可以為 0 會導致 charAt(exp-1) 發生錯誤?不是的。第一個 if 語句也涵蓋了這種情況,因此 exp 值將始終至少為 1。

那就只剩最后一種情況了,輸出結果中是否存在某些奇怪的舍入錯誤?這正是我們接下來要討論的部分……

太多 9

這套解決方案一直運作良好,直到字節數量達到 1 MB。假定輸入為 999999 字節,那么結果(在 SI 模式下)將為“1000.0 kB”。盡管 999999 比 999.9 x 10001 更接近于 1000 x 10001,但根據規范,1000 的“有效位數”超出了范圍。正確的結果應該是“1.0 MB”。

無論如何,在這個帖子的所有 22 個答案中(包括使用 Apache Commons 以及 Android 庫的答案)截至本文撰稿之時都存在這個錯誤(或者其變體)。那么,我們該如何解決?

首先,我們會注意到,一旦字節數比 999.9 x 10001(999.9 k)更接近于 1 x 10002(1 MB),則指數(exp)就應由“k”變更為“M”。例如,9999950 就符合這種情況。同樣的,當我們輸入 999950000 時,我們應該從“M”切換為“G”,依此類推。為了達成這一目標,我們會計算該閾值,一旦字節數超過閾值,則增加 exp:

  1. if (bytes >= Math.pow(unit, exp) * (unit - 0.05)) 
  2.  
  3. exp++; 

調整之后,代碼即可正常工作,直到字節數接近 1 EB。以輸入為 999,949,999,999,999,999 為例,其目前的結果為 1000.0 PB,但正確結果應該是 999.9 PB。但從數學上講,代碼結果又是準確的,這又是怎么回事?這里,我們就遇到了 double(雙)精度機制的局限性。

浮點運算基礎知識

由于采用 IEEE 754 表示方式,因此近零浮點值會非常密集,但大值則非常稀疏。實際上,所有浮點值中的一半都位于 -1 與 1 之間;而在談到大雙精度浮點數時,像 Long.MAX_VALUE 那么大的值已經沒有任何意義了。

  1. double l1 = Double.MAX_VALUE; 
  2.  
  3. double l2 = l1 - Long.MAX_VALUE; 
  4.  
  5. System.err.println(l1 == l2); // prints true 

下面來看兩項有問題的計算:

  • String.format 參數中的除法;
  • exp 進位閾值

我們當然可以切換為 BigDecimal,但這么干就沒意思了。另外,由于標準 API 中沒有 BigDecimal log 函數,所以問題其實仍然存在。

縮小中間值

對于第一個問題,我們可以將字節值縮小至更合理的精度范圍,同時相應調整 exp。無論如何,最終結果都會四舍五入,因此我們要做的就是不要舍棄最低有效數字。

  1. if (exp > 4) { 
  2.  
  3. bytes /= unit; 
  4.  
  5. exp--; 
  6.  

調整最低有效位

對于第二個問題,我們當然關心最低有效位(999、949、99…9 與 999,950,00…0 應該以不同的單位結尾),因此必須得想個不同的解決方案。

首先,我們注意到閾值存在 12 種不同的可能值(每種模式 6 種),而且其中只有一種最終會發生故障。通過以 D0016 結尾這一跡象,可以準確識別出錯誤結果。一旦發生這種情況,我們將其調整為正確值即可。

  1. long th = (long) (Math.pow(unit, exp) * (unit - 0.05)); 
  2.  
  3. if (exp < 6 && bytes >= th - ((th & 0xFFF) == 0xD00 ? 52 : 0)) 
  4.  
  5. exp++; 

由于我們在浮點結果中需要使用特定數位模式,因此下手的對象自然就是 strictfp,旨在保證其不受硬件運行代碼的影響。

負輸入

目前我還沒想到什么情況下有可能需要使用負字節數量,但考慮到 Java 不支持無符號 long,我們最好還是把這個問題考慮進來。現在,如果輸入為 -10000,那么結果為 -10000 B。這里我們引入 absBytes:

  1. long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes); 

這里的表達之所以如此復雜,是基于 -Long.MIN_VALUE == Long.MIN_VALUE 這一事實。現在,我們利用 absBytes 替代 bytes 執行所有與 exp 相關的計算。

最終版本

以下是代碼片段的最終版本,其中已經對最初版本做了精心調整與改進:

  1. // 來自: https://programming.guide/the-worlds-most-copied-so-snippet.html 
  2. public static strictfp String humanReadableByteCount(long bytes, boolean si) { 
  3. int unit = si ? 1000 : 1024
  4. long absBytes = bytes == Long.MIN_VALUE ? Long.MAX_VALUE : Math.abs(bytes); 
  5. if (absBytes < unit) return bytes + " B"
  6. int exp = (int) (Math.log(absBytes) / Math.log(unit)); 
  7. long th = (long) (Math.pow(unit, exp) * (unit - 0.05)); 
  8. if (exp < 6 && absBytes >= th - ((th & 0xfff) == 0xd00 ? 52 : 0)) exp++; 
  9. String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "" : "i"); 
  10. if (exp > 4) { 
  11. bytes /= unit; 
  12. exp -= 1
  13. return String.format("%.1f %sB", bytes / Math.pow(unit, exp), pre); 

請注意,這段代碼最初的目標是避免由循環以及大量分支帶來的復雜性。在解決了所有極端情況之后,新代碼的可讀性要比原始版本更差。我個人是肯定不會把這段代碼復制到生產代碼中的。

這段代碼被復制到了哪里?

此前,一位名叫 Sebastian Baltes 的博士生在《Empirical Software Engineering》上發表了一篇論文,標題為《GitHub 項目中 Stack Overflow 代碼片段的用法與歸因》,文章探討的核心議題只有一個:用戶對代碼片段的引用是否遵循 Stack Overflow 的 CC BY-SA 3.0 許可,即從 Stack Overflow 上復制代碼時,用戶應保證何等程度的歸因水平?

在分析當中,作者從 Stack Overflow 數據轉儲中提取出代碼片段,并將其與公共 GitHub 存儲庫中的代碼進行匹配。下面來看論文的基本發現:

我們進行了一項大規模實證研究,分析了來自各公共 GitHub 項目中的非常規 Java 代碼片段,對其中實際上源自 Stack Overflow 的代碼片段進行了用法與歸因調查。

這篇文章給出了一份表格,而其中 ID 為 3758880 的答案正是我幾年前發布的那一條。截至目前,這條答案獲得了幾十萬次查看外加一千多個好評。只要在 GitHub 上隨便搜搜,就能找到成千上萬條 humanReadableByteCount。

复制粘贴一时爽:传播最广的一段Java代码曝出Bug

這也就意味著,這段有問題的代碼被無數的項目和開發者引用,要驗證這段代碼是否也在自己的本地存儲庫內,請執行以下操作:

  1. $ git grep humanReadableByteCount 

心得摘要

最后,我希望告訴廣大開發者 Stack Overflow 上的代碼片段可能存在 bug,即使得到無數好評也改變不了這一事實;一定要對所有極端情況做出測試,特別是測試那些復制自 Stack Overflow 的代碼;浮點運算很復雜,也很困難,在復制代碼時,請確保了解代碼背后的邏輯和使用規范。 

 

責任編輯:張燕妮 來源: AI前線
相關推薦

2012-07-03 15:04:22

程序員

2020-12-15 06:02:19

瀏覽器Edge智能粘貼

2020-02-07 08:00:29

代碼Java8Bug

2023-10-26 01:30:00

系統架構成本較高

2020-10-26 10:11:45

Jupyter Not早起Python開發

2020-12-31 10:14:42

防注入代碼繞過

2022-06-21 12:27:12

JavaScript前端

2020-06-29 07:49:10

kill -9Java程序員

2020-10-29 15:17:49

代碼開發工具

2018-06-19 08:02:00

統計程序微信

2014-07-08 09:21:10

死代碼創意歌曲

2015-03-27 11:34:59

JavaJava編寫引發內存泄露

2020-04-29 10:19:29

Python數據函數

2018-11-02 16:16:41

程序硬盤存儲

2022-03-23 09:52:41

AI賽車訓練

2024-01-31 09:38:42

2010-07-23 10:23:05

Google機房

2021-02-04 07:55:28

代碼離職互聯網

2018-07-03 13:17:00

2020-04-15 10:01:14

Web工具前端
點贊
收藏

51CTO技術棧公眾號

欧美超级乱淫片喷水| 欧美性生交大片免费| 99re在线观看| 怡红院av久久久久久久| 99久久99热这里只有精品| 精品福利一区二区三区免费视频| 99蜜桃臀久久久欧美精品网站| 五月天婷婷在线视频| 国产一区二区视频在线| 欧美做爰性生交视频| 久久av红桃一区二区禁漫| 在线综合色站| 精品视频在线视频| 久久国产精品网| 五月天婷婷在线视频| 不卡的av网站| 91亚洲精品久久久久久久久久久久| 激情五月色婷婷| 91精品国产91久久久久久黑人| 亚洲国产高潮在线观看| 亚洲18在线看污www麻豆| 深夜在线视频| 亚洲一区二区欧美日韩| 制服国产精品| 98在线视频| 91香蕉视频污| 国产乱人伦精品一区二区| 亚洲天堂2021av| 久久九九国产| 国内精品久久久久久久久| 国产成人av免费在线观看| 一区三区在线欧| 精品免费日韩av| 国产一级免费大片| 国产精品伊人| 在线观看亚洲专区| 99精品视频在线看| 三级中文字幕在线观看| 亚洲成人av在线电影| 人人妻人人澡人人爽精品欧美一区| 国内在线精品| 久久久精品国产免大香伊| 国产伦精品一区二区三| 精品国产va久久久久久久| 麻豆91在线播放免费| 国产欧美日韩高清| 中文字幕第2页| 日本一不卡视频| 日韩免费观看网站| 成人免费毛片视频| 免费日韩av片| 欧美一级片久久久久久久| 精品小视频在线观看| 亚洲五月婷婷| 久久久久九九九九| 一区二区三区免费高清视频| 亚洲欧美综合| 欧美激情精品久久久久久久变态| 欧美日韩偷拍视频| 伊人久久亚洲美女图片| 高清欧美一区二区三区| 精品捆绑调教一区二区三区| 99av国产精品欲麻豆| 久久久久久九九九| 日韩 欧美 精品| 极品av少妇一区二区| 亚州精品天堂中文字幕| 日韩特黄一级片| 久久不射中文字幕| 国产精品福利无圣光在线一区| 9i精品福利一区二区三区| 天天操夜夜操视频| 欧美xxxxxx| 91国在线观看| 国产精品视频中文字幕| 国产精品日本一区二区不卡视频 | 中文字幕一区二区三区日韩精品| 日韩欧美www| 挪威xxxx性hd极品| 亚洲成aⅴ人片久久青草影院| 国产午夜精品全部视频播放| 永久免费未视频| 伊人成人网在线看| 国产精品久久久精品| 国产精品爽爽久久久久久| 成人一区二区三区中文字幕| 日本精品一区二区| 91在线中字| 福利二区91精品bt7086| 亚洲第一狼人区| 99国产精品久久一区二区三区| 亚洲开心激情网| 丝袜美腿小色网| 亚洲综合欧美| 亚洲最大的网站| 你懂的免费在线观看视频网站| 亚洲色图在线播放| 国产91xxx| 成人午夜亚洲| 亚洲精品久久久久久久久久久久| 日本高清黄色片| 黄色一区二区三区四区| 国产精品网红直播| 懂色av成人一区二区三区| 亚洲国产成人在线| 免费拍拍拍网站| 热久久久久久| 亚洲免费中文字幕| 久久视频免费在线观看| 麻豆传媒一区二区三区| 久久精品国产精品青草色艺 | 久久久久国产精品www| 久久精品一区二区三| 青青青伊人色综合久久| 久久96国产精品久久99软件| а√中文在线8| 91福利精品第一导航| 艳妇乳肉豪妇荡乳xxx| 国产精品国产一区| 国产成人精品午夜| 手机av免费在线观看| 亚洲精品高清视频在线观看| 五月婷婷六月丁香激情| 精品不卡一区| 77777少妇光屁股久久一区| 国内精品偷拍视频| 国产精品不卡一区二区三区| 日本熟妇人妻中出| 欧美网色网址| 性欧美亚洲xxxx乳在线观看| 亚洲xxxx天美| 亚洲欧美精品午睡沙发| 午夜剧场高清版免费观看| 精品产国自在拍| 国产精品999999| 国产玉足榨精视频在线观看| 色菇凉天天综合网| 亚洲第一页av| 美女国产一区| 久久婷婷开心| 国产伦精品一区二区三区视频金莲| 亚洲激情电影中文字幕| 国产午夜激情视频| 成人av中文字幕| 男人日女人视频网站| eeuss鲁片一区二区三区| 色与欲影视天天看综合网| 国产人妖一区二区三区| 亚洲人亚洲人成电影网站色| 91人妻一区二区三区| 欧美视频日韩| 国产日韩精品一区观看| 免费v片在线观看| 精品在线观看国产| 极品国产91在线网站| 欧美国产一区在线| 中文字幕成人在线视频| 天天做天天爱天天综合网2021 | 中国女人真人一级毛片| 国产精品青草综合久久久久99| 超碰在线播放91| 亚洲高清影视| 国产精品国产三级国产专区53| 草草在线视频| 亚洲男人天堂网站| 日韩av免费播放| 中文字幕一区在线观看| 手机看片国产精品| 亚洲承认在线| 午夜老司机精品| 九色精品蝌蚪| 午夜精品视频网站| 九色视频在线观看免费播放| 欧美日韩国产在线观看| 精品一区在线观看视频| 99久久婷婷国产| 校园春色 亚洲色图| 中文字幕一区二区三区在线视频 | 欧美 变态 另类 人妖| 爽好多水快深点欧美视频| 亚洲一卡二卡三卡| 中文字幕av一区二区三区四区| 欧美在线性爱视频| 免费看a在线观看| 亚洲精品xxxx| 亚洲图片视频小说| 亚洲电影在线免费观看| 国产伦精品一区二区三区视频女| 国内精品国产三级国产a久久| 天天夜碰日日摸日日澡性色av| 日韩av专区| 国产久一道中文一区| 欧美aaa级| 97精品在线观看| 久久久久久久久免费视频| 亚洲精品720p| 97视频免费在线| 日韩欧美精品在线观看| 成人涩涩小片视频日本| 91色综合久久久久婷婷| 成人在线短视频| 美女视频黄免费的久久| 北条麻妃69av| 9191国语精品高清在线| 欧美日韩精品久久| 亚洲精品一区二区三区中文字幕| 国产精品久久久久久久久久免费 | 久久久久久久久久久妇女| 美女一区视频| 第一区第二区在线| 91牛牛免费视频| 国产精品亚洲d| 97视频在线观看视频免费视频| a视频在线播放| 综合av色偷偷网| 男人天堂亚洲二区| 亚洲激情免费观看| 丰满人妻一区二区三区免费视频 | 无码人妻丰满熟妇区毛片蜜桃精品| 免费一区二区视频| 国内外免费激情视频| 在线午夜精品| 分分操这里只有精品| 综合天天久久| 福利在线小视频| 91精品久久久久久久久久不卡| 日韩一区二区三区高清| 人妖一区二区三区| 国产伦精品一区二区三区免| 涩爱av色老久久精品偷偷鲁| 成人免费自拍视频| 免费视频成人| 国产日韩av在线播放| 日韩精品免费观看视频| 日韩免费观看在线观看| 神马电影网我不卡| 国产福利视频一区二区| 欧美人与性动交xxⅹxx| 国产成人久久久| 国产精品99精品一区二区三区∴| 国产精品视频自在线| 国产亚洲人成a在线v网站| 国产精品高清在线| 成人国产精品| 成人春色激情网| 国产一区一区| 91视频99| 大型av综合网站| 精品亚洲第一| 国产午夜一区| 在线观看欧美一区| 一区二区三区毛片免费| 国产小视频免费| 亚洲一级特黄| 波多野结衣家庭教师在线| 午夜亚洲福利在线老司机| 免费黄色日本网站| 久久久久久一区二区| 蜜桃免费在线视频| 久久99精品久久久| 亚洲欧美日韩中文字幕在线观看| 国产一区二区福利视频| 亚洲av成人片无码| 久久天天做天天爱综合色| 免费看的黄色录像| 亚洲三级在线观看| 久久精品女人毛片国产| 欧美色另类天堂2015| 亚洲一区二区三区网站| 日韩欧美国产综合| 亚洲欧洲综合在线| 在线观看视频99| 日韩经典av| 日韩av免费看| 亚洲伊人精品酒店| 国产精品久久久久久久久久久久冷| 日韩高清影视在线观看| 无码免费一区二区三区免费播放 | 黄频在线免费观看| 亚洲午夜未删减在线观看| 黄网站在线免费看| 555www成人网| 成人在线啊v| 精品欧美一区二区精品久久| 色喇叭免费久久综合网| 国产精品无码人妻一区二区在线| 日韩成人一级大片| 99国产精品免费视频| 久久精品免视看| 妺妺窝人体色www婷婷| 日本韩国一区二区| 亚洲精品免费在线观看视频| 在线日韩精品视频| av免费不卡国产观看| 国产日产久久高清欧美一区| 久久影院资源站| 视频一区二区视频| 免费在线亚洲| 麻豆免费在线观看视频| 欧美国产日韩精品免费观看| 九热这里只有精品| 欧美日韩国产美女| 全部免费毛片在线播放网站| 欧美猛男性生活免费| 91福利精品在线观看| 精品一卡二卡三卡四卡日本乱码 | 国产精品视频一区国模私拍| 美女午夜精品| 91成人在线视频观看| 日韩国产在线一| 精品无码在线视频| 樱桃视频在线观看一区| 亚洲中文字幕在线观看| 亚洲美女动态图120秒| 高清电影在线观看免费| 亚洲自拍偷拍色图| 久久激情电影| 免费大片在线观看| 91免费看`日韩一区二区| 青青草原免费观看| 欧美一区永久视频免费观看| av小片在线| 国产精品www色诱视频| 色婷婷av一区二区三区丝袜美腿| 国产精品一线二线三线| 国产精品系列在线播放| 成人高潮免费视频| 欧美精品一二三| 免费超碰在线| 国产日韩在线亚洲字幕中文| 日本精品三区| 亚洲色图久久久| 日本一区免费视频| 亚洲永久精品一区| 国产香蕉精品视频一区二区三区| 欧美黄色网页| 午夜精品视频在线观看一区二区| 日本在线不卡视频一二三区| 国产亚洲精品熟女国产成人| 日本道在线观看一区二区| 青青青草网站免费视频在线观看| 欧美亚洲在线视频| 色棕色天天综合网| 久久人妻精品白浆国产| 国产欧美一区二区三区网站| 国产精品sm调教免费专区| 色先锋资源久久综合5566| 欧美91在线|欧美| www.亚洲一区二区| 国产电影精品久久禁18| 久久免费小视频| 亚洲激情在线观看| 日本韩国欧美| 亚洲高清123| 久国产精品韩国三级视频| 国产极品国产极品| 亚洲成av人影院在线观看| 美女av在线免费看| 日韩欧美精品久久| 久久99国产精品免费网站| 欧美精品一区二区成人| 亚洲国产中文字幕在线观看| 亚洲欧洲美洲av| 亚洲色图自拍| 国产成a人无v码亚洲福利| 日韩成人高清视频| 夜夜躁日日躁狠狠久久88av | 国产精品大全| 新67194成人永久网站| 手机看片国产日韩| 日韩欧美国产精品一区| 波多野结衣亚洲| 亚洲欧美日韩不卡一区二区三区| 国产寡妇亲子伦一区二区| 91精品国产乱码在线观看| 一区二区三区动漫| 久久99成人| 欧美日韩亚洲第一| 亚洲女人的天堂| 少妇激情av一区二区| 国产伊人精品在线| 亚洲另类视频| 欧美福利在线视频| 亚洲成年人在线播放| 欧美日韩激情电影| 欧美视频在线第一页| 久久精品亚洲一区二区三区浴池 | 久久不卡日韩美女| 国产一区二区三区小说| 国产日韩高清在线| 亚洲经典一区二区| 国产精品久久一| 影音先锋亚洲电影| 极品久久久久久久| 亚洲国产精品va在线看黑人| 亚洲18在线| 欧美 日韩精品| 亚洲成人高清在线| 黄色在线播放网站| 四虎永久在线精品免费一区二区|