青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

編譯器背后的小故事

   工作當(dāng)中遇到過好幾次比較詭異的問題,最后基本都是編譯器搗的鬼,在此總結(jié)一下,以供大家參考,不對之處希望踴躍拍磚(peakflys原創(chuàng)作品,轉(zhuǎn)載注明 )
   編譯環(huán)境:GCC 3.4.5 20051201   (項(xiàng)目組早期代碼從04年開始的),為了脫離實(shí)際項(xiàng)目代碼,下面僅用測試?yán)觼矸从郴疽粯拥膯栴}。
例一:
/**
 *\author peakflys
 *\brief 演示編譯器“潛規(guī)則”
 */
#include <iostream>
#include <limits>
using namespace std;
typedef unsigned int DWORD;
typedef unsigned long QWORD;

int main()
{
    cout<<"max unsigned int : \t"<<numeric_limits<DWORD>::max()<<endl;  
    cout<<"max unsigned long: \t"<<numeric_limits<QWORD>::max()<<endl;  
    DWORD st1 = 4200000000,st2 = 100000000;
    QWORD i1 = st1 + st2; //或者直接就用4200000000 + 100000000 
     cout<<i1<<endl;
    return 0;
}
我服務(wù)器上的運(yùn)行結(jié)果:
max unsigned int :      4294967295
max unsigned long:      18446744073709551615
5032704
如果在高級別的警告環(huán)境下,編譯會(huì)有溢出警告,而運(yùn)行結(jié)果也證明了確實(shí)溢出了。
查看匯編如下:
0x0000000000400949 <main+101>:  movl   $0xfa56ea00,-0x18(%rbp)
0x0000000000400950 <main+108>:  movl   $0x5f5e100,-0x14(%rbp)
0x0000000000400957 <main+115>:  mov    -0x14(%rbp),%eax
0x000000000040095a <main+118>:  add    -0x18(%rbp),%eax
0x000000000040095d <main+121>:  mov    %eax,%eax
0x000000000040095f <main+123>:  mov    %rax,-0x10(%rbp)
0x0000000000400963 <main+127>:  mov    -0x10(%rbp),%rsi
0x0000000000400967 <main+131>:  mov    $0x600ed0,%edi
0x000000000040096c <main+136>:  callq  0x400748 <_ZNSolsEm@plt>
原來編譯器是先把st2值放在eax里,然后和st1相加,結(jié)果還是放在eax里,而eax是32位寄存器,自然溢出了……
修改代碼及運(yùn)行結(jié)果如下:
/**
 *\author peakflys
 *\brief 演示編譯器“潛規(guī)則”
 */
#include <iostream>
#include <limits>
using namespace std;
typedef unsigned int DWORD;
typedef unsigned long QWORD;

int main()
{
    cout<<"max unsigned int : \t"<<numeric_limits<DWORD>::max()<<endl;  
    cout<<"max unsigned long: \t"<<numeric_limits<QWORD>::max()<<endl;  
    DWORD st1 = 4200000000,st2 = 100000000;
    QWORD i1 = (QWORD)st1 + st2;
    cout<<i1<<endl;
    return 0;
}
max unsigned int :      4294967295
max unsigned long:      18446744073709551615
4300000000
這次運(yùn)行正確,直接disassemble,相加代碼匯編如下:
0x0000000000400949 <main+101>:  movl   $0xfa56ea00,-0x18(%rbp)
0x0000000000400950 <main+108>:  movl   $0x5f5e100,-0x14(%rbp)
0x0000000000400957 <main+115>:  mov    -0x18(%rbp),%edx
0x000000000040095a <main+118>:  mov    -0x14(%rbp),%eax
0x000000000040095d <main+121>:  lea    (%rdx,%rax,1),%rax
0x0000000000400961 <main+125>:  mov    %rax,-0x10(%rbp)
0x0000000000400965 <main+129>:  mov    -0x10(%rbp),%rsi
0x0000000000400969 <main+133>:  mov    $0x600ed0,%edi
0x000000000040096e <main+138>:  callq  0x400748 <_ZNSolsEm@plt>
可見這次編譯器動(dòng)用了兩個(gè)寄存器edx和eax來做相加操作,結(jié)果在64為的rax里,自然不會(huì)溢出了。這個(gè)例子的原型是程序里處理玩家獲得經(jīng)驗(yàn)的經(jīng)驗(yàn)公式,本來很多經(jīng)驗(yàn),最后只獲得了極少的經(jīng)驗(yàn)。
例二:
/**
 *\author peakflys
 *\brief 演示編譯器自動(dòng)優(yōu)化
 */
#include <iostream>
using namespace std;
class A
{
    public:
        A(const int _a) : a(a){}
        int a;
};
int main()
{
    cout<<"test1(const Class):\t";
    const A ca(100);
    A *pca = (A*)&ca;
    pca->a = 50; 
    cout<<"initValue: 100"<<"\tconstValue:"<<ca.a<<"\tnonconstValue:"<<pca->a<<endl;

    cout<<"test2(const int):\t";
    const int a = 100;
    int *pi = (int *)&a;
    *pi = 50; 
    cout<<"initValue: 100"<<"\tconstValue:"<<a<<"\tnonconstValue:"<<*pi<<endl;

    cout<<"test3(const string):\t";
    const string s("中國"); "
    char *ps = const_cast<char*> (s.c_str());
    strcpy(ps,"美國"); "
    cout<<"initValue: 中國"<<"\tconstValue:"<<s<<"\tnonconstValue:"<<ps<<endl;nd

    return 0;
}
運(yùn)行結(jié)果如下:
test1(const Class):     initValue: 100  constValue:50   nonconstValue:50
test2(const int):       initValue: 100  constValue:100  nonconstValue:50
test3(const string):    initValue: 中國 constValue:美國 nonconstValue:美國
程序中強(qiáng)制去除const的代碼很粗暴,很ugly,但是 實(shí)際使用中有時(shí)候不得不因?yàn)楦鞣N原因而使用這樣的代碼。上面例子中對于class類型(自定義的classA和系統(tǒng)的class string)和系統(tǒng)基本類型(上面的int)強(qiáng)制去掉棧對象的const屬性再做操作是可行的(這樣的const僅僅是編譯器操作的const,如果是字符串常量等實(shí)際常量區(qū)的對象強(qiáng)行操作,操作系統(tǒng)會(huì)發(fā)飆的……),但是操作結(jié)果卻不一樣,查看匯編:
ump of assembler code for function main:
0x0000000000400b24 <main+0>:    push   %rbp
0x0000000000400b25 <main+1>:    mov    %rsp,%rbp
0x0000000000400b28 <main+4>:    push   %r12
0x0000000000400b2a <main+6>:    push   %rbx
0x0000000000400b2b <main+7>:    sub    $0x50,%rsp

***********************************test1*********************************************

0x0000000000400b2f <main+11>:   mov    $0x400e48,%esi
0x0000000000400b34 <main+16>:   mov    $0x601300,%edi
0x0000000000400b39 <main+21>:   callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b3e <main+26>:   lea    -0x30(%rbp),%rdi                  //ca的棧地址!
0x0000000000400b42 <main+30>:   mov    $0x64,%esi
0x0000000000400b47 <main+35>:   callq  0x400d36 <A>                       //調(diào)用A構(gòu)造函數(shù)
0x0000000000400b4c <main+40>:   lea    -0x30(%rbp),%rax
0x0000000000400b50 <main+44>:   mov    %rax,-0x28(%rbp)               //pca的棧地址!
0x0000000000400b54 <main+48>:   mov    -0x28(%rbp),%rax
0x0000000000400b58 <main+52>:   movl   $0x32,(%rax)                       //pca所地址(即ca),賦值0x32(50)
0x0000000000400b5e <main+58>:   mov    -0x28(%rbp),%rax                //從右向左壓棧 ,先取出pca值 
0x0000000000400b62 <main+62>:   mov    (%rax),%r12d                      //取出pca所指內(nèi)存值 
0x0000000000400b65 <main+65>:   mov    -0x30(%rbp),%ebx               //取出ca值
0x0000000000400b68 <main+68>:   mov    $0x400e5d,%esi                  //
0x0000000000400b6d <main+73>:   mov    $0x601300,%edi                  //壓棧esi、edi,裝備調(diào)用callq 
0x0000000000400b72 <main+78>:   callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b77 <main+83>:   mov    %rax,%rdi
0x0000000000400b7a <main+86>:   mov    $0x400e6c,%esi
0x0000000000400b7f <main+91>:   callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b84 <main+96>:   mov    %rax,%rdi
0x0000000000400b87 <main+99>:   mov    %ebx,%esi
0x0000000000400b89 <main+101>:  callq  0x4008e0 <_ZNSolsEi@plt>
0x0000000000400b8e <main+106>:  mov    %rax,%rdi
0x0000000000400b91 <main+109>:  mov    $0x400e79,%esi
0x0000000000400b96 <main+114>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400b9b <main+119>:  mov    %rax,%rdi
0x0000000000400b9e <main+122>:  mov    %r12d,%esi
0x0000000000400ba1 <main+125>:  callq  0x4008e0 <_ZNSolsEi@plt>
0x0000000000400ba6 <main+130>:  mov    %rax,%rdi
0x0000000000400ba9 <main+133>:  mov    $0x4009a0,%esi
0x0000000000400bae <main+138>:  callq  0x400990 <_ZNSolsEPFRSoS_E@plt>

***********************************test2*********************************************

0x0000000000400bb3 <main+143>:  mov    $0x400e89,%esi
0x0000000000400bb8 <main+148>:  mov    $0x601300,%edi
0x0000000000400bbd <main+153>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400bc2 <main+158>:  movl   $0x64,-0x34(%rbp)                   //a地址,ox64(100)放入此處
0x0000000000400bc9 <main+165>:  lea    -0x34(%rbp),%rax
0x0000000000400bcd <main+169>:  mov    %rax,-0x20(%rbp)                    //pi地址,放入a地址
0x0000000000400bd1 <main+173>:  mov    -0x20(%rbp),%rax                    //取出pi地址
0x0000000000400bd5 <main+177>:  movl   $0x32,(%rax)                           //pi所指內(nèi)容(即a)賦值50
0x0000000000400bdb <main+183>:  mov    -0x20(%rbp),%rax                     //從右向左壓棧 ,先取出pi值  
0x0000000000400bdf <main+187>:  mov    (%rax),%ebx                             //pi所指內(nèi)存值 
                                                                                                        //此處沒有取a的值???
0x0000000000400be1 <main+189>:  mov    $0x400e5d,%esi                        //
0x0000000000400be6 <main+194>:  mov    $0x601300,%edi                        //壓棧esi、edi,裝備調(diào)用callq  
0x0000000000400beb <main+199>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400bf0 <main+204>:  mov    %rax,%rdi
0x0000000000400bf3 <main+207>:  mov    $0x400e6c,%esi
0x0000000000400bf8 <main+212>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400bfd <main+217>:  mov    %rax,%rdi
0x0000000000400c00 <main+220>:  mov    $0x64,%esi
0x0000000000400c05 <main+225>:  callq  0x4008e0 <_ZNSolsEi@plt>
0x0000000000400c0a <main+230>:  mov    %rax,%rdi
0x0000000000400c0d <main+233>:  mov    $0x400e79,%esi
0x0000000000400c12 <main+238>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400c17 <main+243>:  mov    %rax,%rdi
0x0000000000400c1a <main+246>:  mov    %ebx,%esi
0x0000000000400c1c <main+248>:  callq  0x4008e0 <_ZNSolsEi@plt>
0x0000000000400c21 <main+253>:  mov    %rax,%rdi
0x0000000000400c24 <main+256>:  mov    $0x4009a0,%esi
0x0000000000400c29 <main+261>:  callq  0x400990 <_ZNSolsEPFRSoS_E@plt>

***********************************test3*********************************************

0x0000000000400c2e <main+266>:  mov    $0x400e9c,%esi
0x0000000000400c33 <main+271>:  mov    $0x601300,%edi
0x0000000000400c38 <main+276>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400c3d <main+281>:  lea    -0x29(%rbp),%rdi
0x0000000000400c41 <main+285>:  callq  0x4009b0 <_ZNSaIcEC1Ev@plt>
0x0000000000400c46 <main+290>:  lea    -0x29(%rbp),%rdx
0x0000000000400c4a <main+294>:  lea    -0x40(%rbp),%rdi
0x0000000000400c4e <main+298>:  mov    $0x400eb2,%esi
0x0000000000400c53 <main+303>:  callq  0x400960 <_ZNSsC1EPKcRKSaIcE@plt>
0x0000000000400c58 <main+308>:  lea    -0x29(%rbp),%rdi
0x0000000000400c5c <main+312>:  callq  0x400980 <_ZNSaIcED1Ev@plt>
0x0000000000400c61 <main+317>:  lea    -0x40(%rbp),%rdi
0x0000000000400c65 <main+321>:  callq  0x4008f0 <_ZNKSs5c_strEv@plt>
0x0000000000400c6a <main+326>:  mov    %rax,-0x48(%rbp)
0x0000000000400c6e <main+330>:  jmp    0x400c8e <main+362>
0x0000000000400c70 <main+332>:  mov    %rax,-0x58(%rbp)
0x0000000000400c74 <main+336>:  mov    -0x58(%rbp),%rbx
0x0000000000400c78 <main+340>:  lea    -0x29(%rbp),%rdi
0x0000000000400c7c <main+344>:  callq  0x400980 <_ZNSaIcED1Ev@plt>
0x0000000000400c81 <main+349>:  mov    %rbx,-0x58(%rbp)
0x0000000000400c85 <main+353>:  mov    -0x58(%rbp),%rdi
0x0000000000400c89 <main+357>:  callq  0x4009d0 <_Unwind_Resume@plt>
0x0000000000400c8e <main+362>:  mov    -0x48(%rbp),%rax
0x0000000000400c92 <main+366>:  mov    %rax,-0x18(%rbp)
0x0000000000400c96 <main+370>:  mov    -0x18(%rbp),%rax
0x0000000000400c9a <main+374>:  movl   $0xe58ebee7,(%rax)
0x0000000000400ca0 <main+380>:  movw   $0xbd9b,0x4(%rax)
0x0000000000400ca6 <main+386>:  movb   $0x0,0x6(%rax)
0x0000000000400caa <main+390>:  mov    $0x400eb9,%esi
0x0000000000400caf <main+395>:  mov    $0x601300,%edi
0x0000000000400cb4 <main+400>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400cb9 <main+405>:  mov    %rax,%rdi
0x0000000000400cbc <main+408>:  mov    $0x400e6c,%esi
0x0000000000400cc1 <main+413>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400cc6 <main+418>:  mov    %rax,%rdi
0x0000000000400cc9 <main+421>:  lea    -0x40(%rbp),%rsi
0x0000000000400ccd <main+425>:  callq  0x400970 <_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@plt>
0x0000000000400cd2 <main+430>:  mov    %rax,%rdi
0x0000000000400cd5 <main+433>:  mov    $0x400e79,%esi
0x0000000000400cda <main+438>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400cdf <main+443>:  mov    %rax,%rdi
0x0000000000400ce2 <main+446>:  mov    -0x18(%rbp),%rsi
0x0000000000400ce6 <main+450>:  callq  0x400940 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt>
0x0000000000400ceb <main+455>:  mov    %rax,%rdi
0x0000000000400cee <main+458>:  mov    $0x4009a0,%esi
0x0000000000400cf3 <main+463>:  callq  0x400990 <_ZNSolsEPFRSoS_E@plt>
0x0000000000400cf8 <main+468>:  mov    $0x0,%ebx
0x0000000000400cfd <main+473>:  lea    -0x40(%rbp),%rdi
0x0000000000400d01 <main+477>:  callq  0x400950 <_ZNSsD1Ev@plt>
0x0000000000400d06 <main+482>:  mov    %ebx,-0x4c(%rbp)
0x0000000000400d09 <main+485>:  jmp    0x400d29 <main+517>
0x0000000000400d0b <main+487>:  mov    %rax,-0x58(%rbp)
0x0000000000400d0f <main+491>:  mov    -0x58(%rbp),%rbx
0x0000000000400d13 <main+495>:  lea    -0x40(%rbp),%rdi
0x0000000000400d17 <main+499>:  callq  0x400950 <_ZNSsD1Ev@plt>
0x0000000000400d1c <main+504>:  mov    %rbx,-0x58(%rbp)
0x0000000000400d20 <main+508>:  mov    -0x58(%rbp),%rdi
0x0000000000400d24 <main+512>:  callq  0x4009d0 <_Unwind_Resume@plt>
0x0000000000400d29 <main+517>:  mov    -0x4c(%rbp),%eax
0x0000000000400d2c <main+520>:  add    $0x50,%rsp
0x0000000000400d30 <main+524>:  pop    %rbx
0x0000000000400d31 <main+525>:  pop    %r12
0x0000000000400d33 <main+527>:  leaveq 
0x0000000000400d34 <main+528>:  retq 
因test1和test3基本原理一樣,故上面匯編注釋只有test1和test2的,從上面匯編可以看出,編譯器調(diào)用cout時(shí),參數(shù)入棧是從右向左的,對于test1是取出pca所指內(nèi)存值入棧,再取ca所指內(nèi)存值入棧,然后調(diào)用cout輸出。但是test2入棧的卻只有pi所指內(nèi)存值,i并沒有入棧。匯編沒顯示,個(gè)人認(rèn)為 應(yīng)該是編譯器在匯編時(shí)就做了優(yōu)化,把cout中的常量a直接替換掉了。這種錯(cuò)誤在實(shí)際項(xiàng)目中顯現(xiàn)出的問題很詭異,剛開始也很難查,所以強(qiáng)轉(zhuǎn)基本類型const時(shí)注意這種情況。
例三、待續(xù)……
                                                                                                                                                            (peakflys原創(chuàng)作品,轉(zhuǎn)載注明 )

posted on 2012-07-27 17:08 peakflys 閱讀(3579) 評論(4)  編輯 收藏 引用 所屬分類: C++

評論

# re: 編譯器背后的小故事 2012-07-28 08:22 ntest

第二個(gè)示例,應(yīng)該是int常量和object(string也算object)常量不同的原因, 好比值類型與引用類型.
int可以放到寄存器中,作為常量當(dāng)然可以直接替換.
而object需要占用內(nèi)存空間,const只是限制對object的修改,強(qiáng)轉(zhuǎn)之后就去除了這個(gè)限制.  回復(fù)  更多評論   

# re: 編譯器背后的小故事 2012-07-29 14:46 zgpxgame

s1,s2是同類型,不會(huì)發(fā)生隱式類型轉(zhuǎn)換,結(jié)果當(dāng)然也是同類型的而溢出,隱式類型轉(zhuǎn)換發(fā)生在賦值時(shí)

strcpy(ps,"美國") 如果只是試驗(yàn),倒也關(guān)系不大,實(shí)際中這樣可能導(dǎo)致問題  回復(fù)  更多評論   

# re: 編譯器背后的小故事 2012-07-30 10:48 peakflys

@ntest 而object需要占用內(nèi)存空間???
這位仁兄的意思是const int 沒有內(nèi)存的占用,只有寄存器的占用?上面例二加上匯編碼是為了說明,const int入棧時(shí) 沒有從內(nèi)存取值,應(yīng)該是編譯器優(yōu)化直接從類似的符號表(同C中的define一樣)里取出數(shù)值。  回復(fù)  更多評論   

# re: 編譯器背后的小故事 2012-07-30 11:01 peakflys

@zgpxgame
例一的結(jié)果自然是發(fā)生在隱式轉(zhuǎn)換之前的值溢出,但 關(guān)鍵應(yīng)該是上面提到的GCC編譯器做運(yùn)算時(shí)如果后面運(yùn)算值沒有超過32位的,都會(huì)用32位寄存器做運(yùn)算,只有你運(yùn)算值本身有大于32位的或者程序中強(qiáng)制轉(zhuǎn)換成大于32位的(如例一后來改的那樣),編譯器才會(huì)有64位寄存器的參與。就如同如果上面是把兩個(gè)unsigned short的最大值,即65535+65535賦給一個(gè)unsigned int值,程序運(yùn)行正常,不會(huì)發(fā)生溢出。
PS string強(qiáng)轉(zhuǎn)去除const屬性,在實(shí)際應(yīng)用中會(huì)出現(xiàn),但是一般項(xiàng)目中都不會(huì)強(qiáng)制改變它的內(nèi)容,上面例二僅僅是測試類常量和基本值常量直接些許的差別。  回復(fù)  更多評論   

<2013年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

導(dǎo)航

統(tǒng)計(jì)

公告

人不淡定的時(shí)候,就愛表現(xiàn)出來,敲代碼如此,偶爾的靈感亦如此……

常用鏈接

留言簿(4)

隨筆分類

隨筆檔案

文章檔案

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品影视| 欧美系列一区| 久久国产乱子精品免费女| 狂野欧美激情性xxxx欧美| 亚洲一二区在线| 欧美成人综合一区| 久久噜噜噜精品国产亚洲综合| 欧美日韩一区二区三| 欧美激情一区二区三区全黄| 一色屋精品视频在线观看网站| 亚洲综合激情| 亚洲欧美卡通另类91av| 欧美精品一区二区三区蜜臀| 亚洲国产成人在线| 尤物九九久久国产精品的分类| 欧美伊人久久大香线蕉综合69| 亚洲女同在线| 国产精品国产精品国产专区不蜜| 亚洲精品少妇30p| 日韩视频免费观看高清完整版| 久久久久久一区二区三区| 久久久99久久精品女同性| 国产美女精品| 久久狠狠亚洲综合| 久久免费99精品久久久久久| 国产一区二区三区成人欧美日韩在线观看| 亚洲午夜高清视频| 亚洲一级网站| 国产精品嫩草影院av蜜臀| 亚洲夜间福利| 久久高清国产| 国产亚洲美州欧州综合国| 久久成人免费| 亚洲电影免费观看高清完整版| 亚洲伦理精品| 国产精品国产三级国产| 亚洲永久精品大片| 欧美韩国日本一区| 亚洲欧洲精品天堂一级| 亚洲午夜久久久久久尤物| 欧美无乱码久久久免费午夜一区| 亚洲手机在线| 久久久久久久综合色一本| 亚洲第一偷拍| 欧美日韩国产麻豆| 亚洲欧美影音先锋| 久久综合久久久久88| 亚洲经典三级| 欧美三级小说| 久久国产精品毛片| 欧美高清自拍一区| 亚洲欧美日韩一区二区三区在线观看| 国产欧美日韩免费| 久久久综合激的五月天| 91久久精品日日躁夜夜躁国产| 亚洲自拍偷拍一区| 激情六月婷婷综合| 欧美日韩国产黄| 欧美在线观看日本一区| 亚洲成人中文| 在线观看日韩国产| 欧美日韩和欧美的一区二区| 欧美一区二区三区在线视频| 欧美激情精品久久久久久久变态 | 国产亚洲欧美一区二区| 久久欧美中文字幕| 在线视频中文亚洲| 欧美二区不卡| 久久国产免费| 亚洲一区二区3| 亚洲电影免费在线| 国产伦精品一区二区三区高清版| 欧美成人小视频| 欧美一区二区三区视频| 最新国产拍偷乱拍精品| 久久久综合激的五月天| 亚洲午夜精品久久久久久浪潮 | 亚洲国产欧美另类丝袜| 午夜国产精品影院在线观看 | 久久国产一区| 亚洲图片在线观看| 在线精品视频一区二区三四| 国产伦一区二区三区色一情| 欧美精品在线免费观看| 久久天堂av综合合色| 亚洲综合精品四区| av不卡在线| 亚洲国产人成综合网站| 老司机精品视频一区二区三区| 亚洲欧美精品在线观看| 日韩一级免费| 亚洲激情偷拍| 亚洲第一福利社区| 国产一区二区精品久久99| 国产精品久久久久久久7电影| 欧美理论在线播放| 欧美成黄导航| 欧美福利影院| 免费在线观看一区二区| 久久精品国产99| 久久精品视频在线看| 欧美一进一出视频| 性做久久久久久| 午夜在线精品| 久久er99精品| 久久久99爱| 美国十次成人| 欧美1区视频| 欧美成人一区二免费视频软件| 免费欧美日韩| 欧美高清在线一区| 欧美不卡在线视频| 欧美激情黄色片| 欧美日韩性生活视频| 国产精品二区三区四区| 国产精品豆花视频| 国产日韩一区二区三区在线播放| 国产精品自拍三区| 国产一区二区三区黄| 国语自产精品视频在线看抢先版结局 | 午夜精品久久久久| 欧美与黑人午夜性猛交久久久| 久久高清免费观看| 久久精选视频| 欧美顶级大胆免费视频| 欧美日本精品在线| 国产精品美女999| 国产在线拍揄自揄视频不卡99 | 亚洲一区精品视频| 午夜精品一区二区三区在线| 久久福利毛片| 欧美激情va永久在线播放| 亚洲日本理论电影| 亚洲在线日韩| 麻豆精品视频在线观看| 欧美日韩国内自拍| 国产亚洲精品bt天堂精选| 亚洲第一精品影视| 99综合视频| 久久久亚洲高清| 亚洲欧洲一区二区三区| 亚洲综合国产激情另类一区| 久久综合伊人77777麻豆| 欧美日韩午夜| 雨宫琴音一区二区在线| 国产精品99久久久久久宅男| 久久久久久久综合色一本| 欧美黑人在线观看| 亚洲一区美女视频在线观看免费| 久久久噜噜噜久噜久久| 欧美日韩一区二| 亚洲高清在线观看一区| 亚洲一区二区三区在线看| 欧美ed2k| 欧美亚洲一区二区三区| 欧美日韩一区二区免费视频| 黄色成人av网站| 亚洲愉拍自拍另类高清精品| 欧美成人午夜激情视频| 亚洲欧美中文另类| 欧美屁股在线| 亚洲国产三级| 久久人人看视频| 亚洲永久在线观看| 欧美黑人在线播放| 韩国三级在线一区| 欧美一区二区三区四区视频| 亚洲激情视频在线| 久久综合久色欧美综合狠狠 | 国产精品电影在线观看| 91久久久在线| 蜜臀久久99精品久久久画质超高清| 一本色道久久综合亚洲精品小说| 蜜臀av性久久久久蜜臀aⅴ| 国产午夜精品视频| 欧美一级黄色网| 亚洲视频一区| 国产精品九九| 亚洲一区日韩在线| 日韩视频一区二区在线观看| 免费一级欧美片在线观看| 国内一区二区在线视频观看| 亚久久调教视频| 亚洲性夜色噜噜噜7777| 国产精品高潮呻吟| 亚洲一区二区三区精品在线| 亚洲另类春色国产| 欧美精品三级| 亚洲精品在线视频观看| 亚洲大片在线观看| 麻豆视频一区二区| 在线看片一区| 欧美高清免费| 欧美国内亚洲| 99国产成+人+综合+亚洲欧美| 亚洲黄色一区二区三区| 欧美精品观看| 亚洲性图久久| 一区二区国产精品| 国产精品日韩精品欧美在线|