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

自上而下,逐步揭開PHP解析大整數的面紗

開發 后端
眾所周知,PHP是一門解釋型語言,所以當時就大膽地猜測PHP是在編譯期間就將數字的字面量常量轉換成float類型,并用科學計數法表示。但僅僅猜測不能滿足自己的好奇心,想要看到真正實現代碼才愿意相信。于是就逐步分析、探索,直到找到背后的實現。

遇到的問題

最近遇到一個PHP大整數的問題,問題代碼是這樣的

 

  1. $shopId = 17978812896666957068;  
  2. var_dump($shopId); 

 

上面的代碼輸出,會把$shopId轉換成float類型,且使用了科學計數法來表示,輸出如下:

  1. float(1.7978812896667E+19) 

但在程序里需要的是完整的數字作為查找數據的參數,所以需要用的是完整的數字,當時以為只是因為數據被轉換成科學計數法了,于是想到的解決方案是強制讓它不使用科學計數法表示:

 

  1. $shopId= number_format(17978812896666957068);  
  2. var_dump($shopId); 

這時候奇怪的事情出現了,輸出的是:

  1. 17978812896666957824 

當時沒有仔細看,對比了前十位就沒有繼續往下看,所以認為問題解決了,等到真正根據ID去找數據的時候才發現數據查不出來,這時候才發現是數據轉換錯誤了。

這里使用number_format失敗的原因在后面會講到,當時就想到將原來的數據轉成字符串的,但是使用了以下方法仍然不行

 

  1. $shopId= strval(17978812896666957068); 
  2. var_dump($shopId); 
  3.  
  4. $shopId = 17978812896666957068 . ‘’; 
  5. var_dump($shopId); 

 

輸出的結果都是

 

  1. float(1.7978812896667E+19) 

***只有下面這種方案是可行的:

 

  1. $shopId = ‘17978812896666957068’; 
  2. var_dump($shopId); 
  3.  
  4. // 輸出 
  5. //string(20) "17978812896666957068" 

 

眾所周知,PHP是一門解釋型語言,所以當時就大膽地猜測PHP是在編譯期間就將數字的字面量常量轉換成float類型,并用科學計數法表示。但僅僅猜測不能滿足自己的好奇心,想要看到真正實現代碼才愿意相信。于是就逐步分析、探索,直到找到背后的實現。

剛開始根據這個問題直接上網搜“PHP大整數解析過程”,并沒有搜到答案,因此只能自己去追查。一開始對PHP的執行過程不熟悉,出發點就只能是一步一步地調試,然后

示例代碼:

 

  1. // test.php 
  2. $var = 17978812896666957068; 
  3. var_dump($var); 

 

追查過程

1、查看opcode

通過vld查看PHP執行代碼的opcode,可以看到,賦值的是一個ASSIGN的opcode操作

自上而下,逐步揭開PHP解析大整數的面紗

接下來就想看看ASSIGN是在哪里執行的。

2、gdb調試

2-1、用list查看有什么地方可以進行斷點

自上而下,逐步揭開PHP解析大整數的面紗

2-2、暫時沒有頭緒,在1186斷點試試

自上而下,逐步揭開PHP解析大整數的面紗

結果程序走到sapi/cli/php_cli.c文件的1200行了,按n不斷下一步執行,一直到這里就走到了程序輸出結果了:

自上而下,逐步揭開PHP解析大整數的面紗

2-4、于是猜測,ASSIGN操作是在do_cli函數里面進行的,因此對do_cli函數做斷點:break do_cli。

輸入n,不斷回車,在sapi/cli/php_cli.c文件的993行之后就走到程序輸出結果了:

自上而下,逐步揭開PHP解析大整數的面紗

2-5、再對php_execute_script函數做斷點:break php_execute_script,不斷逐步執行,發現在main/main.c文件的2537行就走到程序輸出結果了:

自上而下,逐步揭開PHP解析大整數的面紗

2-6、繼續斷點的步驟:break zend_execute_scripts,重復之前的步驟,發現在zend/Zend.c文件的1476行走到了程序輸出結果的步驟:

自上而下,逐步揭開PHP解析大整數的面紗

看到這里的時候,第1475行里有一個op_array,就猜測會不會是在op_array的時候就已經有值了,于是開始打印op_array的值:

自上而下,逐步揭開PHP解析大整數的面紗

打印之后并沒有看到有用的信息,但是其實這里包含有很大的信息量,比如opcode的handler: ZEND_ASSIGN_SPEC_CV_RETVAL_CV_CONST_RETVAL_UNUSED_HANDLER ,但是當時沒注意到,因此就想著看看op_array是怎么被賦值的,相關步驟做了什么。

2-7、重新從2-5的斷點開始,讓程序逐步執行,看到op_array的賦值如下:

自上而下,逐步揭開PHP解析大整數的面紗

看到第1470行將zend_compile_file函數運行的結果賦值給op_array了,于是break zend_compile_file,被告知zend_compile_file未定義,通過源碼工具追蹤到zend_compile_file指向的是compile_file,于是break zend_compile

發現是在Zend/zend_language_scanner.l 文件斷點了,逐步執行,看到這行pass_two(op_array),猜測可能會在這里就有值,所以打印看看:

自上而下,逐步揭開PHP解析大整數的面紗

結果發現還是跟之前的一樣,但是此時看到有一個opcodes的值,再打印看看

自上而下,逐步揭開PHP解析大整數的面紗

看到opcode = 38,網上查到38代表賦值

自上而下,逐步揭開PHP解析大整數的面紗

2-8、于是可以知道,在這一步之前就已得到了ASSIGN的opcode,因此,不斷地往前找,從op_array開始初始化時就開始,逐步打印op_array->opcodes的值,一直都是null,

自上而下,逐步揭開PHP解析大整數的面紗

直到執行了 CG(zend_lineno) = last_lineno; 才得到opcode = 38 的值:

自上而下,逐步揭開PHP解析大整數的面紗

因為這一句:CG(zend_lineno) = last_lineno;是一個宏,所以也沒頭緒,接近放棄狀態。。。

于是先去了解opcode的數據結構,在 深入理解PHP內核書 里找到opcode處理函數查找這一章,給了我一些繼續下去的思路。

引用里面的內容:

在PHP內部有一個函數用來快速的返回特定opcode對應的opcode處理函數指針:zend_vm_get_opcode_handler()函數:

自上而下,逐步揭開PHP解析大整數的面紗

知道其實opcode處理函數的命名是有以下規律的

  1. ZEND_[opcode]_SPEC_(變量類型1)_(變量類型2)_HANDLER 

根據之前調試打印出來的內容,在2-6的時候就看到了一個handler的值:

自上而下,逐步揭開PHP解析大整數的面紗

  1. ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_HANDLER, 

找出函數的定義如下:

自上而下,逐步揭開PHP解析大整數的面紗

可以看到,opcode操作的時候,值是從EX_CONSTANT獲取的,根據定義展開這個宏,那就是

  1. opline->op2->execute_data->literals 

這里可以得到兩個信息:

  1. 參數的轉換在opcode執行前就做好了
  2. 賦值過程取值時是在op2->execute_data->literals,如果猜想沒錯的話,op2->execute_data->literals此時保存的就是格式轉換后的值,可以打印出來驗證一下

打印結果如下:

自上而下,逐步揭開PHP解析大整數的面紗

猜想驗證正確,但是沒有看到真正做轉換的地方,還是不死心,繼續找PHP的Zend底層做編譯的邏輯代碼。

參考開源的 GitHub項目 ,PHP編譯階段如下圖:

自上而下,逐步揭開PHP解析大整數的面紗

猜測最有可能的是在zendparse、zend_compile_top_stmt這兩個階段完成轉換,因為這個兩個階段做的事情就是將PHP代碼轉換成opcode數組。

上網搜索了PHP語法分析相關的文章,有一篇里面講到了解析整數的過程,因此找到了PHP真正將大整數做轉換的地方:

 

  1. <ST_IN_SCRIPTING>{LNUM} { 
  2. char *end
  3. if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ 
  4.     errno = 0; 
  5.     ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, 0)); 
  6.     /* This isn't an assert, we need to ensure 019 isn't valid octal 
  7.     * Because the lexing itself doesn't do that for us 
  8.     */ 
  9.     if (end != yytext + yyleng) { 
  10.         zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0); 
  11.         ZVAL_UNDEF(zendlval); 
  12.         RETURN_TOKEN(T_LNUMBER); 
  13.     } 
  14. else { 
  15.     errno = 0; 
  16.     ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, 0)); 
  17.     if (errno == ERANGE) { /* Overflow */ 
  18.         errno = 0; 
  19.         if (yytext[0] == '0') { /* octal overflow */ 
  20.             ZVAL_DOUBLE(zendlval, zend_oct_strtod(yytext, (const char **)&end)); 
  21.         } else { 
  22.             ZVAL_DOUBLE(zendlval, zend_strtod(yytext, (const char **)&end)); 
  23.         } 
  24.         /* Also not an assert for the same reason */ 
  25.         if (end != yytext + yyleng) { 
  26.             zend_throw_exception(zend_ce_parse_error, 
  27.             "Invalid numeric literal", 0); 
  28.             ZVAL_UNDEF(zendlval); 
  29.             RETURN_TOKEN(T_DNUMBER); 
  30.         } 
  31.         RETURN_TOKEN(T_DNUMBER); 
  32.     }     
  33.     /* Also not an assert for the same reason */ 
  34.     if (end != yytext + yyleng) { 
  35.         zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0); 
  36.         ZVAL_UNDEF(zendlval); 
  37.         RETURN_TOKEN(T_DNUMBER); 
  38.     } 
  39. ZEND_ASSERT(!errno); 
  40. RETURN_TOKEN(T_LNUMBER); 

可以看到,zend引擎在對PHP代碼在對純數字的表達式做詞法分析的時候,先判斷數字是否有可能會溢出,如果有可能溢出,先嘗試將其用LONG類型保存,如果溢出,先用zend_strtod將其轉換為double類型,然后用double類型的zval結構體保存之。

number_format失敗的原因

通過gdb調試,追查到number_format函數,在PHP底層最終會調用php_conv_fp函數對數字進行轉換:

自上而下,逐步揭開PHP解析大整數的面紗

函數原型如下:

  1. PHPAPI char * php_conv_fp(register char format, register double num, boolean_e add_dp, int precisionchar dec_point, bool_int * is_negative, char *buf, size_t *len); 

這里接收的參數num是一個double類型,因此,如果傳入的是字符串類型數字的話,number_format函數也會將其轉成double類型傳入到php_conf_fp函數里。而這個double類型的num最終之所以輸出為17978812896666957824,是因為進行科學計數法之后的精度丟失了,重新轉成double時就恢復不了原來的值。在C語言下驗證:

 

  1. double local_dval = 1.7978812896666958E+19; 
  2. printf("%f\n", local_dval); 

 

輸出的結果就是

17978812896666957824.000000

所以,這不是PHP的bug,它就是這樣的。

此類問題解決方案

對于存儲,超過PHP***表示范圍的純整數,在MySQL中可以使用bigint/varchar保存,MySQL在查詢出來的時候會將其使用string類型保存的。

對于賦值,在PHP里,如果遇到有大整數需要賦值的話,不要嘗試用整型類型去賦值,比如,不要用以下這種:

  1. $var = 17978812896666957068; 

而用這種:

  1. $var = '17978812896666957068'

而對于number_format,在64位操作系統下,它能解析的精度不會丟失的數,建議的***值是這個:9007199254740991。參考鳥哥博客: http://www.laruence.com/2011/12/19/2399.html

總結

這個問題的原因看起來不太重要,雖然學這個對于實際上的業務開發也沒什么用,不會讓你的開發能力“duang"地一下上去幾個level,但是了解了PHP對于大整數的處理,也是自己知識框架的一個小小積累,知道了為什么之后,在日常開發中就會多加注意,比如從存儲以及使用賦值的角度。了解這個細節還是很有好處的。

回想整個解決問題的過程,個人感覺有點長,總共大約花了4個小時去定位這個問題。因為對PHP的內核只是一知半解,沒有系統的把整個流程梳理下來,所以一開始也不知道從哪里開始下手,就開始根據自己的猜測來調試。現在回想起來,應該先學習PHP的編譯、執行流程,然后再去猜測具體的步驟。

責任編輯:未麗燕 來源: hoohack
相關推薦

2009-06-01 09:04:44

Google WaveWeb

2022-01-16 18:51:57

.NET 6Configurati配置

2013-09-22 11:03:20

SocketSocket編程

2019-10-12 10:50:00

JavaScript編程語言代碼

2015-08-20 13:43:17

NFV網絡功能虛擬化

2009-09-08 16:30:18

網銀木馬

2014-03-12 11:11:39

Storage vMo虛擬機

2021-06-07 08:18:12

云計算云端阿里云

2010-05-17 09:13:35

2023-06-07 13:43:49

云計算

2010-05-26 19:12:41

SVN沖突

2009-12-03 09:19:41

Linux系統奧秘

2018-03-01 09:33:05

軟件定義存儲

2023-11-02 09:55:40

2009-09-15 15:34:33

Google Fast

2016-04-06 09:27:10

runtime解密學習

2025-01-08 15:44:04

2021-01-22 08:00:00

云計算IT安全

2024-02-14 09:00:00

機器學習索引ChatGPT

2016-11-16 09:06:59

點贊
收藏

51CTO技術棧公眾號

国内在线免费视频| 一级做a爰片久久毛片16| 大香伊人久久精品一区二区| 午夜精品福利久久久| 精品1区2区| 中文字幕在线日亚洲9| 一区二区中文| 亚洲男人天堂2024| 波多野结衣免费观看| av日韩中文| 国产免费观看久久| 国产精品av一区| 波多野结衣不卡| 欧美福利专区| 国产亚洲精品美女久久久久| 亚洲少妇中文字幕| 第四色男人最爱上成人网| 中文字幕一区不卡| 欧美精品一区二区三区在线四季| 国产美女免费看| 六月丁香综合| 欧美激情乱人伦| 国产一级淫片久久久片a级| jizzjizzjizz欧美| 精品视频在线免费观看| 欧美 日韩 国产 高清| 黄网站免费在线观看| 99re这里只有精品首页| 亚洲a∨日韩av高清在线观看| 九九热在线视频播放| 国产大片一区| 亚洲性av在线| 亚洲成人av免费在线观看| 精品一区二区三区免费看| 色婷婷国产精品| 国内精品视频一区二区三区| av在线播放国产| 中文字幕欧美激情一区| 欧美日韩免费观看一区| 亚洲精品喷潮一区二区三区| 久久国产精品区| 欧日韩不卡在线视频| 日韩免费在线视频观看| 欧美福利视频| 欧美乱大交xxxxx另类电影| 日韩不卡av在线| 国产中文字幕一区二区三区| 亚洲国产精品va| 污污视频在线免费| 亚洲欧洲二区| 在线不卡一区二区| 天天操天天干天天做| 黄色精品视频| 欧美日韩一区视频| 向日葵污视频在线观看| 99riav视频一区二区| 色综合 综合色| 欧美少妇性生活视频| 中文字幕这里只有精品| 色狠狠综合天天综合综合| 精品中文字幕av| 亚洲精品中文字幕| 色哦色哦哦色天天综合| 免费人成自慰网站| 啦啦啦中文在线观看日本| 亚洲精品视频自拍| 欧洲精品在线播放| 俺来俺也去www色在线观看| 亚洲第一狼人社区| 成人在线免费观看av| 涩涩av在线| 日本韩国精品一区二区在线观看| 粗暴91大变态调教| 欧美爱爱视频| 日韩三级.com| 精品人妻一区二区免费视频| 免费av一区二区三区四区| 国产一区二区三区精品久久久| 精品人妻中文无码av在线| 日本一本不卡| 麻豆乱码国产一区二区三区| 久久国产精品波多野结衣| 亚洲精品日本| 国产精品久久久久久av| 99热这里只有精| 成人avav在线| 午夜一区二区三区| 成年人黄视频在线观看| 午夜精品久久久久影视| 免费黄色一级网站| 久久精品一级| 国产视频在线一区二区| 国精品人伦一区二区三区蜜桃| 亚洲成人三区| 日本最新高清不卡中文字幕| 影音先锋国产在线| 国产成人久久精品77777最新版本| 久久国产精品精品国产色婷婷 | 性欧美精品高清| 国产精品美乳在线观看| www.精品视频| 国产欧美日韩在线看| 99热一区二区三区| 亚洲天堂导航| 欧美一级片在线观看| 国产ts丝袜人妖系列视频| 久久视频在线| 欧美亚洲在线播放| 一级日韩一级欧美| 久久亚洲精精品中文字幕早川悠里| 在线成人性视频| 成人欧美大片| 亚洲精品在线免费播放| 极品蜜桃臀肥臀-x88av| 在线日本成人| 亚洲xxxxx| 成人jjav| 欧美性猛交xxxx乱大交极品| 亚洲性图第一页| 欧美日韩水蜜桃| 2021久久精品国产99国产精品| 国产精品一区二区av白丝下载 | 欧美下载看逼逼| 欧美黑人猛交的在线视频| 在线观看视频91| 波多野结衣影院| 欧美精品入口| 91精品国产综合久久男男| 免费a级片在线观看| 亚洲欧洲日产国码二区| 午夜激情在线观看视频| 农村少妇一区二区三区四区五区| 欧美大胆在线视频| 亚洲无码精品在线观看| 国产欧美精品在线观看| 日韩中文字幕在线视频观看 | 免费成人美女在线观看.| 国精产品99永久一区一区| 日韩经典av| 日韩欧美一区在线| 黄视频网站免费看| 精品一区二区三区在线播放| 日韩欧美亚洲v片| 二区三区不卡| 亚洲女人天堂成人av在线| 91香蕉在线视频| 99久久精品一区| 激情五月宗合网| 欧美五码在线| 97久久国产精品| 五月婷婷六月激情| 五月天激情小说综合| 麻豆精品国产传媒av| 亚洲国产免费| 精品一区二区不卡| 色资源二区在线视频| 亚洲美女精品成人在线视频| 欧美一区二区激情视频| 久久先锋影音av鲁色资源| 亚洲自偷自拍熟女另类| 免费久久久久久久久| 国产国产精品人在线视| 啊v在线视频| 欧美精品一卡二卡| 日韩影院一区二区| 高清不卡在线观看| 久久免费视频3| 欧美精品momsxxx| 国产精品视频公开费视频| 在线看av的网址| 欧美一区二区成人6969| 国产精品日日夜夜| 久久蜜臀中文字幕| www.se五月| 欧美特黄一区| 麻豆亚洲一区| 亚洲影视资源| 欧美精品久久久久久久久| 天堂中文网在线| 色哟哟精品一区| 亚洲一二三在线观看| 国产.精品.日韩.另类.中文.在线.播放| 日本阿v视频在线观看| 性欧美xxxx免费岛国不卡电影| 国产高清视频一区三区| 中文字幕有码在线视频| 日韩经典一区二区三区| 在线免费看av的网站| 夜夜嗨av一区二区三区中文字幕| 免费成人蒂法网站| 日本最新不卡在线| 国产精品日韩三级| 精品国产aⅴ| 不卡日韩av| 成人激情综合| 欧美另类暴力丝袜| yjizz视频网站在线播放| 91精品国产黑色紧身裤美女| www成人在线| 亚洲天堂免费看| 国产精品三级在线观看无码| 久久国产夜色精品鲁鲁99| 青青草成人免费在线视频| 日韩精品电影| 鲁片一区二区三区| 久久伦理中文字幕| 国产91在线播放精品91| 日韩欧美一起| 色吧影院999| 亚洲人视频在线观看| 日韩欧美高清一区| 毛片在线免费播放| 精品成人av一区| 亚洲色婷婷一区二区三区| 久久久精品免费观看| 91porn在线| 国内精品免费在线观看| 日本精品一区二区三区四区| 国产精品黄色| 亚洲三区在线| 神马电影久久| 精品免费二区三区三区高中清不卡| 亚洲欧洲二区| 国产精品91一区| 午夜影院一区| 久久免费视频在线观看| 成人午夜一级二级三级| 国产在线观看免费麻豆| 亚洲美女av电影| 色屁屁草草影院ccyycom| 欧美欧美午夜aⅴ在线观看| 欧美一级片免费在线观看| 亚洲色图视频网| 在线观看日本黄色| 久久免费午夜影院| 国产精品无码在线| 高清不卡一二三区| 最新日本中文字幕| 国产一区二三区好的| 中文字幕天天干| 日韩和欧美一区二区| 亚洲国产精品毛片av不卡在线| 亚洲黄色大片| 日本福利视频一区| 欧美体内she精视频在线观看| 国产欧美自拍视频| 亚洲精品成人无限看| 中国老女人av| 欧美精品午夜| 国产日韩亚洲欧美在线| 欧美激情成人在线| 五月天激情图片| 欧美日韩视频| 日本黄大片在线观看| 欧美日韩三级电影在线| 日本大胆人体视频| 尤物在线精品| 男女激情无遮挡| 亚洲永久在线| 激情六月丁香婷婷| 日本视频一区二区三区| 亚洲天堂国产视频| 国产一区二区91| 风韵丰满熟妇啪啪区老熟熟女| 丰满亚洲少妇av| 亚洲精品乱码久久久久久久| 2023国产精品自拍| 久久婷婷五月综合| 中文字幕中文字幕在线一区| 美女网站视频色| 亚洲综合一区二区| 日本在线播放视频| 欧美色图免费看| 国产伦理一区二区| 亚洲精品一区二区三区四区高清 | 国产亚洲精品久久久久久777| 国产在线观看免费| 日韩色av导航| 国产深夜视频在线观看| 国产91精品视频在线观看| 69堂精品视频在线播放| 4444kk亚洲人成电影在线| 国产亚洲精品美女久久| 青青草国产精品| 亚洲a一区二区三区| 黄色片网址在线观看| 久久久久国产精品一区二区| 亚洲精品mv在线观看| 成人精品视频一区| 日韩免费成人av| 亚洲成人777| 影音先锋黄色网址| 亚洲国产精品一区二区三区| 高清性色生活片在线观看| 久久久精品影院| 特黄毛片在线观看| 91九色视频在线| 蜜臀久久99精品久久一区二区| 日韩国产精品毛片| 久久久一二三| 韩国黄色一级片| 中文字幕成人av| 日韩精品手机在线| 欧美一区二区国产| porn视频在线观看| 国产91成人video| 高清一区二区| 亚洲欧美日韩精品久久久| 亚洲视频福利| 亚洲免费黄色录像| 久久久久久久久久久久久久久99 | 牛牛精品一区二区| 成人久久18免费网站图片| 香蕉久久精品日日躁夜夜躁| 99久re热视频精品98| 日韩二区三区在线观看| 日本一区二区在线免费观看| 亚洲乱码国产乱码精品精98午夜| 国产女主播喷水视频在线观看| 精品国产区一区| 91高清在线观看视频| 国产精品免费看久久久香蕉| 神马久久av| 久久久性生活视频| 国产aⅴ综合色| 91麻豆免费视频网站| 欧美色图在线观看| 国产中文字幕在线视频| 2024亚洲男人天堂| 欧美绝顶高潮抽搐喷水合集| 少妇久久久久久被弄到高潮| 久久精品国产99国产精品| 免费看91的网站| 欧美性生活大片免费观看网址| 婷婷丁香一区二区三区| 久久久久久久久91| eeuss国产一区二区三区四区| 老汉色影院首页| 国内精品久久久久影院色 | 国产精品久久久久久久| 三年中国国语在线播放免费| 久久这里只有精品视频网| 日韩av黄色片| 亚洲成人网在线观看| 污污的网站在线免费观看| 98国产高清一区| 欧美99在线视频观看| 欧美体内she精高潮| 亚洲视频狠狠干| 国产按摩一区二区三区| 久久国产精品影视| 日韩成人在线观看视频| 久久久久福利视频| 国产激情视频一区二区在线观看| 欧美大片xxxx| 欧美成人高清电影在线| av电影在线免费| 精品麻豆av| 视频一区二区三区中文字幕| 国产亚洲精品熟女国产成人| 日本道在线观看一区二区| 国产高清美女一级毛片久久| 国产精品嫩草影院久久久| 91亚洲成人| 中文字幕在线视频一区二区| 亚洲精品视频一区| 黄色av小说在线观看| 欧美亚洲国产视频| 国产a久久精品一区二区三区 | 中文字幕国产亚洲| 少妇高潮一区二区三区99| 51xx午夜影福利| av一区二区久久| 国产精品午夜一区二区| 久久精品美女视频网站| 69精品国产久热在线观看| 色综合av综合无码综合网站| 国产精品大尺度| 囯产精品一品二区三区| 欧美又大又粗又长| 97精品国产| 制服丝袜在线第一页| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 亚洲第一级黄色片| 欧美momandson| 在线观看视频黄色| 99在线精品观看| 91久久精品无码一区二区| 高清欧美性猛交| 欧美理论在线播放| 性折磨bdsm欧美激情另类| 精品久久久免费| 欧美日韩在线资源| 精品在线不卡| 激情亚洲综合在线| 一级片中文字幕| 久久偷看各类女兵18女厕嘘嘘| 麻豆一区一区三区四区| 日本免费色视频| 色综合久久久久综合99|