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

Linux下c/c++項目代碼覆蓋率的產生方法

系統 Linux
最近做了一系列的單元測試相關的工作,除了各種規范及測試框架以外,討論比較多的就是關于代碼覆蓋率的產生,c/c++與其他的一些高級語言或者腳本語言相比較而言,例如 Java、.Net和php/python/perl/shell等,由于沒有這些高級語言和腳本語言的反射的特性,其代碼覆蓋率的產生過程會稍微復雜一些。發現許多同學對C++的覆蓋率如何產生在都不太清楚,這里做一個簡單的介紹。

最近做了一系列的單元測試相關的工作,除了各種規范及測試框架以外,討論比較多的就是關于代碼覆蓋率的產生,c/c++與其他的一些高級語言或者腳本語言相比較而言,例如 Java、.Net和php/python/perl/shell等,由于沒有這些高級語言和腳本語言的反射的特性,其代碼覆蓋率的產生過程會稍微復雜一些。發現許多同學對C++的覆蓋率如何產生在都不太清楚,這里做一個簡單的介紹。

一、基本使用方法

在Linux上的c/c++開發一般都使用gcc/g++作為主要的編譯器,如果需要產生覆蓋率數據需要在Makefile或者Scons文件中做下面的編譯鏈接設置,

  • 編譯的時候,增加 -fprofile-arcs -ftest-coverage 或者 –coverage;
  • 鏈接的時候,增加 -fprofile-arcs 或者 –lgcov;
  • 打開–g3 選項,去掉-O2以上級別的代碼優化選項;否則編譯器會對代碼做一些優化,例如行合并,從而影響行覆蓋率結果;

基本要求就上面三點,但有一個建議,為了上述幾個編譯選項的使用不影響到正常的編譯過程(否則會極大地影響程序的運行效率)。在使用makefile中通過參數傳遞來支持覆蓋率產生,可以在makefile使用下面的方式,

ifeq ($(coverage), yes)

CXXFLAGS       +=  -fprofile-arcs -ftest-coverage

LINKERCXX      +=  -fprofile-arcs -ftest-coverage

OPT_FLAGS     =  -g3

endif

這樣,可以使用 make coverage=yes 來引入這些編譯選項而不會影響到正常的編譯(scons同理)。

二、簡單示例

這里寫了一個簡單的程序做測試,主要包含三個文件:Rectangle.cpp, RectangleTest.cpp, Makefile。

1)Rectangle.cpp 是被測代碼,里面定義了一個簡單的類Rectangle(長方形),里面有三個方法:

  • set_values(),設置長方形對象的長和寬;
  • area(),求長方形的面積;
  • lenth(),求長放形的周長;

2)RectangleTest.cpp 是一個簡單的測試程序,為了demo使用,并沒有使用cppunit/gtest這樣的單元測試框架,直接使用了main()函數來調用Rectangle里面的方法;

Rectangle.cpp和RectangleTest.cpp的代碼如下圖,

3)Makefile比較簡單,主要支持在coverage=yes的參數支持。 可以使用-fprofile-arcs -ftest-coverage 選項,這里為了簡化使用了 –coverage。

覆蓋率產生的過程如下面四個步驟所示,其中步驟3和4,根據需要使用其中一種即可。

1. 編譯鏈接帶覆蓋率參數的源代碼;

2. 運行測試程序;

3. 使用gcov獲取文本形式的覆蓋率數據;

4. 使用lcov獲取html形式的覆蓋率數據;


下面針對本例,做這一過程的逐步演示。

1. 編譯鏈接帶覆蓋率參數的源代碼;

由于Makeifle中已經支持了coverage=yes選項,直接運行 “make coverage=yes”,這個時候會產生測試程序,并同時生成gcno文件(關于gcno文件的詳細解釋,參見第三部分背后原理),如下圖,

2. 運行測試程序;

運行./RectangleTest 測試程序,運行結束后,會針對所有的cpp源代碼文件產生相應的*.gcda文件(關于gcda文件的詳細解釋,參見第三部分背后原理),如下圖

3. 使用gcov獲取文本形式的覆蓋率數據;

需要注意的是,這個步驟不是必須的,如果需要文本格式(*.gcov)的覆蓋率結果,可是走這個步驟。如果想看html格式的結果,直接跳過這一步驟。gcov是gcc自帶的覆蓋率結果產生工具,無需單獨安裝。

針對某個源代碼文件,例如 Rectangle.cpp,執行”gcov Rectangle.cpp” 會產生Rectangle.cpp.gcov文件。

 

這是一個存文本文件,可以通過vim打開,看到詳細的行覆蓋率數據,如下

4. 使用lcov獲取html形式的覆蓋率數據;

有些時候需要使用html結果的數據展示,這樣看起來更加直觀一些。IBM開源了lcov這個工具,更多參見 http://ltp.sourceforge.net/coverage/lcov.php

工具使用,如下圖,

 

手動把cc_result目錄拷貝到http/apache等服務器的htdocs目錄下,可以通過瀏覽器來查看覆蓋率結果,如下,

 

整個覆蓋率生成的流程按照上面四個步驟就可以搞定。下面一節對其原理做簡單的闡述。

 

三、基本原理

1. 術語解釋

在了解背后原理之前,需要對覆蓋率技術的一些概念有簡單的了解。主要是基本塊(Basic Block),基本塊圖(Basic Block Graph),行覆蓋率(line coverage), 分支覆蓋率(branch coverage)等。

  • 基本塊(Basic Block),”A basic block is a sequence of instructions with only entry and only one exit. If any one of the instructions are executed, they will all be executed, and in sequence from first to last.”  這里可以把基本塊看成一行整體的代碼,基本塊內的代碼是線性的,要不全部運行,要不都不運行;
  • 基本塊圖(Basic Block Graph),基本塊的最后一條語句一般都要跳轉,否則后面一條語句也會被計算為基本塊的一部分。 如果跳轉語句是有條件的,就產生了一個分支(arc),該基本塊就有兩個基本塊作為目的地。如果把每個基本塊當作一個節點,那么一個函數中的所有基本塊就構成了一個有向圖,稱之為基本塊圖(Basic Block Graph)。且只要知道圖中部分BB或arc的執行次數就可以推算出所有的BB和所有的arc的執行次數;
  • 打樁,意思是在有效的基本塊之間增加計數器,計算該基本塊被運行的次數;打樁的位置都是在基本塊圖的有效邊上;
  • 行覆蓋率(line coverage),源代碼有效行數與被執行的代碼行的比率;
  • 分支覆蓋率(branch coverage),有判定語句的地方都會出現2個分支,整個程序經過的分支與所有分支的比率是分支覆蓋率。注意,與條件覆蓋率(condition coverage)有細微差別,條件覆蓋率在判定語句的組合上有更細的劃分。
2.  gcc/g++ 編譯選項

gcc需要靜態注入目標程序編譯選項,在編譯鏈接的時候加入2個選項(-ftest-coverage -fprofile-arcs ),編譯結束之后會生成 *.gcno 文件,而經過靜態注入的目標程序在“正常結束”后,會在運行目錄下產生*.gcda數據文件,通過gcov工具就可產生覆蓋率數據結果。

-ftest-coverage

Produce a notes file that the gcov code-coverage utility (see gcov—a Test Coverage Program) can use to show program coverage. Each source file’s note file is called auxname.gcno. Refer to the -fprofile-arcs option above for a description of auxname and instructions on how to generate test coverage data. Coverage data matches the source files more closely if you do not optimize.
讓編譯器生成與源代碼同名的.gcno文件(note file),這種文件含有重建基本塊依賴圖和將源代碼關聯至基本塊的必要信息;


-fprofile-arcs

Add code so that program flow arcs are instrumented. During execution the program records how many times each branch and call is executed and how many times it is taken or returns. When the compiled program exits it saves this data to a file called auxname.gcda for each source file. The data may be used for profile-directed optimizations (-fbranch-probabilities), or for test coverage analysis (-ftest-coverage). Each object file’s auxname is generated from the name of the output file, if explicitly specified and it is not the final executable, otherwise it is the basename of the source file. In both cases any suffix is removed (e.g. foo.gcda for input file dir/foo.c, ordir/foo.gcda for output file specified as -o dir/foo.o). See Cross-profiling.

讓編譯器靜態注入對每個源代碼行關聯的計數器進行操作的代碼,并在鏈接階段鏈入經態度libgcov.a,其中包含在程序正常結束時生成*.gcda文件的邏輯;

下面通過源碼解析來說明到底這2個選項做了什么。通過g++ -S選項,產生匯編語言Rectangle.s 和 Rectangle_cc.s (增加–coverage選項),命令如下,

g++ -c -o Rectangle.s Rectangle.cpp -g -Wall -S

g++ -c -o Rectangle_cc.s Rectangle.cpp -g -Wall –coverage -S

vimdiff Rectangle.s 和 Rectangle_cc.s,如下圖


通過這樣匯編語言的對比,可以看出gcc通過這2個參數,把打樁的過程完成了。

更深入的內容,例如,如果想知道gcno/gcda文件的格式,可以參考 @livelylittlefish 的一篇文章,GCC Coverage代碼分析-.gcda/.gcno文件及其格式分析http://blog.csdn.net/livelylittlefish/article/details/6448885)。

 

四、擴展話題

通過上面三部分的介紹,相信絕大多數覆蓋率問題都可以解決,下面2個問題是我們在實際運行過程中遇到的,也分享一下。

  1. 覆蓋率的結果只有被測試到的文件會被顯示,并非所有被編譯的代碼都被作為覆蓋率的分母

實際上,可以看到整個覆蓋率的產生的過程是4個步驟的流程,一般都通過外圍腳本,或者makefile/shell/python來把整個過程自動化。2個思路去解決這個問題,都是通過外圍的偽裝。第一個,就是修改lcov的 app.info ,中間文件,找到其他的文件與覆蓋率信息的地方,結合makefile,把所有被編譯過的源程序檢查是否存于 app.info 中,如果沒有,增加進去。第二個偽裝,是偽裝 *.gcda,沒有一些源碼覆蓋率信息的原因就是該文件沒有被調用到,沒有響應的gcda文件產生。toast(http://toast.taobao.org/)是通過第一種偽裝來實現的,更多了解需要去看下開源代碼。

2. 后臺進程的覆蓋率數據收集;
 

其實上述覆蓋率信息的產生,不僅可以針對單元測試,對于功能測試同樣適用。但功能測試,一般linux下c/c++都是實現了某個Daemon進程,而覆蓋率產生的條件是程序需要正常退出,即用戶代碼調用 exit 正常結束時,gcov_exit 函數才得到調用,其繼續調用 __gcov_flush 函數輸出統計數據到 *.gcda 文件中。同樣2個思路可以解決這個問題,

第一,給被測程序增加一個 signal handler,攔截 SIGHUP、SIGINT、SIGQUIT、SIGTERM 等常見強制退出信號,并在 signal handler 中主動調用 exit 或 __gcov_flush 函數輸出統計結果。但這個需要修改被測程序。這個也是我們之前的通用做法。但參加過清無同學的一個講座后,發現了下面第二種更好的方法。

第二,借用動態庫預加載技術和 gcc 擴展的 constructor 屬性,我們可以將 signalhandler 和其注冊過程都封裝到一個獨立的動態庫中,并在預加載動態庫時實現信號攔截注冊。這樣,就可以簡單地通過如下命令行來實現異常退出時的統計結果輸出了。

 

五、其他編程語言

在我們的工程實踐中,還有其他的編程語言,都涉及到覆蓋率的產生,我們的工程實踐推薦下面的方法,
 
  • c/c++,  本文介紹的方法;
  • Java,  Maven  cobertura 插件;
  • Python, PyUnit +  coverage.py
  • Php, phpunit +  –coverage-html ;
  • Perl,  Test::Class 和 Devel::Cover;
  • Shell,  shUnit2 + shcov;
責任編輯:張浩 來源: 淘寶直公的博客
相關推薦

2011-11-01 10:10:48

ScriptCover

2023-10-27 08:49:00

JCovOpenJDK

2022-05-31 09:01:18

SwiftApp 項目

2021-12-25 22:30:27

Chrome DevTJavaScript調試工具

2012-04-11 11:21:57

ibmdw

2025-10-20 04:22:00

2025-09-01 01:00:00

2024-05-31 12:50:49

C++編程NaN

2019-09-25 09:20:41

谷歌代碼開發者

2020-06-17 12:22:44

C覆蓋重載

2010-02-01 17:02:53

C++產生隨機數

2021-10-15 13:47:19

覆蓋率檢測 istanbul 總代碼的比例

2024-06-14 12:04:33

2011-04-25 09:49:20

代碼測試

2025-02-25 00:18:45

AIC#單元測試

2015-04-17 10:35:51

c++c++程序內存泄漏檢測代碼

2010-02-03 14:30:04

C++棧對象

2016-01-13 10:14:15

WebPHP函數覆蓋

2015-11-09 17:56:57

WebPHP函數覆蓋

2010-03-26 10:05:22

Python嵌入CC++
點贊
收藏

51CTO技術棧公眾號

www.com毛片| 99久久伊人精品影院| 欧美激情视频二区| 在线播放成人| 亚洲香肠在线观看| 欧美成人在线免费观看| 一级特黄aaa大片| 精品999日本| 亚洲视频在线免费观看| 中文字幕资源在线观看| 久久男人天堂| 亚洲视频在线一区观看| 久久五月天婷婷| 国产日本精品视频| 久久精品免费| 欧美激情一区二区三区久久久| 日韩人妻无码一区二区三区| 国产精品白丝久久av网站| 欧美日韩国产麻豆| 波多野结衣激情| 色视频精品视频在线观看| 六月婷婷色综合| 欧美亚洲第一页| 欧美成人精品激情在线视频| 欧美日韩在线二区| 亚洲成人a级网| 欧美国产在线一区| 精品成人av| 欧美日韩精品在线| www.国产二区| 国产黄色在线观看| 日本一区二区免费在线| 久久综合毛片| 色网站免费观看| 国产成人自拍在线| 成人免费在线网址| 黄色一区二区视频| 米奇777在线欧美播放| 久久久久久久久亚洲| 国产精品国产精品88| 国产精品一区二区av日韩在线| 欧美α欧美αv大片| 欧美国产日韩另类| 日韩av黄色| 欧美主播一区二区三区美女| 18禁免费无码无遮挡不卡网站| 久色国产在线| 亚洲一区二区高清| 国产 欧美 日韩 一区| 菠萝菠萝蜜在线视频免费观看| 国产精品麻豆久久久| 深夜福利成人| av在线电影网| 国产精品无码永久免费888| 日韩免费中文专区| 成人影院免费观看| 国产精品久久久久aaaa樱花| 天天综合狠狠精品| av在线免费观看网| 国产精品久久三区| 中国一级黄色录像| 丝袜综合欧美| 午夜精品久久久久| 久久综合九色综合88i| jk漫画禁漫成人入口| 色老综合老女人久久久| 一道本视频在线观看| 99欧美精品| 777奇米四色成人影色区| 久久久精品视频国产| 日韩在线观看中文字幕| 精品国产91亚洲一区二区三区婷婷| 四虎精品一区二区| 美女久久99| www.欧美精品| 久草视频在线免费看| 亚洲精品婷婷| 日本一区二区三区在线播放| 中文字幕在线天堂| 国产原创一区二区| 国产一区二区在线观看免费播放| 神马亚洲视频| 1024精品合集| 欧美男女爱爱视频| 黄色精品视频网站| 欧美xxxxxxxxx| 日韩av一二区| 久久精品一区二区不卡| 久久久久久综合网天天| 久久精品视频2| 国产精品一区一区三区| 久久伊人资源站| 久草免费在线| 狠狠色噜噜狠狠狠狠97| 在线观看免费视频高清游戏推荐| 亚洲专区**| 国产亚洲日本欧美韩国| 久久午夜鲁丝片午夜精品| 视频在线观看一区| 3d精品h动漫啪啪一区二区| 天堂资源最新在线| 成人欧美一区二区三区小说 | 亚洲色大成网站www久久九九| 国产一级不卡视频| 91精品影视| 精品久久人人做人人爱| 国产综合精品久久久久成人av| 欧美激情一区| 国产精品青草久久久久福利99| www.色呦呦| 中文子幕无线码一区tr| 久久综合九色综合88i| 99久久这里有精品| 亚洲性生活视频| 日韩成人一区二区三区| 国内精品自线一区二区三区视频| 欧美一区少妇| 国产精品一区二区日韩| 欧美一区二区免费| 三级黄色免费观看| 日韩成人午夜电影| 欧美大香线蕉线伊人久久国产精品| 国产一区久久精品| 欧美日韩中文字幕一区| 麻豆av免费观看| 中日韩视频在线观看| 国产精品香蕉视屏| 亚洲男同gay网站| 欧美麻豆精品久久久久久| 欧美高清性xxxx| 99视频一区| 国产在线精品二区| sm在线播放| 精品国产污污免费网站入口| 丝袜 亚洲 另类 欧美 重口| 麻豆精品一区二区av白丝在线| 欧美日韩精品中文字幕一区二区| а√天堂中文资源在线bt| 欧美xxxxx牲另类人与| 永久免费看黄网站| 国产成人免费视频| 91亚洲精品国产| 中文字幕区一区二区三| 欧美富婆性猛交| 成人免费观看在线视频| 伊人夜夜躁av伊人久久| 久久无码人妻一区二区三区| 久久精品国内一区二区三区水蜜桃 | 懂色av粉嫩av浪潮av| 日精品一区二区三区| 日韩电影大全在线观看| 日韩成人影音| 在线观看不卡av| 亚洲天堂avav| 亚洲情趣在线观看| 手机精品视频在线| 欧美久久影院| 激情久久av| 日本在线影院| 国产一区二区动漫| 91成人一区二区三区| 亚洲乱码日产精品bd| 亚洲欧美激情一区二区三区| 国产综合自拍| 蜜桃久久精品乱码一区二区 | 91精品国产综合久久精品| www.色小姐com| 不卡av在线免费观看| 欧美日韩精品在线一区二区 | 亚洲日本一区二区三区在线不卡| 日本亚洲欧洲无免费码在线| 色与欲影视天天看综合网| 少妇精品视频一区二区| 日本道色综合久久| 中日韩一级黄色片| 波多野结衣中文一区| 国产精品-区区久久久狼| 久久精品国产99久久| 91在线观看网站| 国产一二三在线| 中文字幕在线成人| 亚洲风情第一页| 一本色道久久综合亚洲aⅴ蜜桃| 美国黄色特级片| 高清不卡一二三区| 免费黄色一级网站| 国产精品videossex久久发布| 久久久久久久久久码影片| 色猫猫成人app| 欧美日韩电影在线观看| 男人天堂网在线观看| 欧美一级二级在线观看| 国产一级18片视频| 亚洲精品中文字幕乱码三区| 特级西西人体wwwww| 紧缚奴在线一区二区三区| 精品国产av无码一区二区三区| 国产中文字幕一区二区三区| 亚洲综合视频1区| 日韩不卡免费高清视频| 欧美国产日韩免费| 国产区视频在线播放| 精品处破学生在线二十三| 欧美男人天堂网| 亚洲国产aⅴ天堂久久| 国产精品情侣呻吟对白视频| 99国产精品久久久久| 天天av天天操| 久久中文在线| 青青青青在线视频| 欧美激情理论| 清纯唯美一区二区三区| 国产精品流白浆在线观看| 成人激情黄色网| 日韩一级二级| 欧美在线视频免费观看| 免费看电影在线| 另类色图亚洲色图| 91官网在线| 亚洲欧洲免费视频| 午夜小视频免费| 欧美videos大乳护士334| 在线观看色网站| 一本色道久久综合亚洲精品按摩| 日本在线观看视频网站| 一区二区三区欧美日韩| 天堂av免费在线| 欧美激情一区二区在线| 偷拍女澡堂一区二区三区| av一本久道久久综合久久鬼色| 激情久久综合网| 精品一区二区精品| 久久久久国产一区| 视频一区二区国产| 人妻内射一区二区在线视频| 中文国产一区| 久久视频这里有精品| 亚洲黄色av| 久久久久久久久久久99| 一区二区福利| 久久久999视频| 亚洲专区欧美专区| 欧美极品欧美精品欧美图片| 国产精品免费看| 欧美日韩国产精品激情在线播放| 亚洲国产午夜| 日本少妇高潮喷水视频| 日韩一级在线| 免费无码国产v片在线观看| 亚洲影院免费| 欧美 国产 小说 另类| 久久综合婷婷| 国产主播中文字幕| 麻豆国产欧美日韩综合精品二区| 网站一区二区三区| 激情综合五月天| 少妇欧美激情一区二区三区| 国产不卡在线播放| av黄色一级片| 国产视频在线观看一区二区三区| 亚洲天堂视频一区| 国产精品美女久久久久久| 国产精品精品软件男同| 一区二区三区在线视频观看| 精品在线视频免费| 色综合天天视频在线观看| 这里只有精品免费视频| 这里只有精品电影| 高清一区二区三区四区| 国产丝袜一区二区| 牛牛影视精品影视| 日韩最新在线视频| 亚洲制服国产| 欧美做爰性生交视频| 成人在线黄色| 国产精品sss| 国产伦一区二区三区| 老司机av福利| 亚洲日韩视频| 日韩av在线中文| 不卡一二三区首页| 亚洲欧美另类日本| 午夜精品一区二区三区免费视频| 波多野结衣在线电影| 日韩欧美中文字幕制服| 日av在线播放| 草民午夜欧美限制a级福利片| h片在线观看视频免费| 国产精品欧美风情| 国产厕拍一区| 天天综合中文字幕| 香蕉久久久久久久av网站| 日本在线一二三区| 99国产精品国产精品久久| 国产又粗又长又硬| 精品久久久久久久久中文字幕 | 成人午夜免费电影| 亚洲精品国产精品国自| 亚洲国产成人tv| 91亚洲视频在线观看| 日韩国产欧美区| www.在线视频| 国产精品欧美久久久| 欧美一性一交| 成人免费看片'免费看| 日本中文在线一区| 最近日本中文字幕| 亚洲免费色视频| 伊人网av在线| 亚洲精品自产拍| 91色在线看| 92国产精品视频| 青青草97国产精品麻豆| 97国产精东麻豆人妻电影| 国产麻豆视频精品| 欧美成人久久久免费播放| 欧美丝袜一区二区| 六月婷婷综合网| 久久99久国产精品黄毛片入口| 国产一区二区精品调教| 免费毛片一区二区三区久久久| 国产精品九九| 精产国品一二三区| 中文字幕一区二区在线观看| 免费黄色片视频| 亚洲欧美另类自拍| 少妇视频一区| 精品一区久久久| 99精品视频免费观看| 插我舔内射18免费视频| 一区二区三区国产| av免费观看在线| 九九九久久久久久| 欧美日本三级| 欧美日韩dvd| 国产精品一二三区| 99视频只有精品| 欧美大胆人体bbbb| 性欧美videos高清hd4k| 亚洲综合在线小说| 在线国产一区二区| 伊人精品视频在线观看| 亚洲日本在线看| 国产熟女精品视频| 超碰日本道色综合久久综合| 精品国产亚洲一区二区三区| 国产奶头好大揉着好爽视频| 激情六月婷婷久久| 久久精品视频免费在线观看| 日韩一区二区三区免费看| a视频在线观看| 超碰97在线资源| 激情一区二区| 欧美 变态 另类 人妖| 色噜噜偷拍精品综合在线| 成人在线观看一区| 成人免费在线视频网站| 欧美网站在线| 艳妇乳肉亭妇荡乳av| 日韩欧美国产激情| а天堂8中文最新版在线官网| 成人免费看吃奶视频网站| 欧美久久综合| 一级性生活大片| 精品污污网站免费看| bestiality新另类大全| 国产乱码精品一区二区三区日韩精品| 日韩一级在线| www中文在线| 欧美videos大乳护士334| 亚洲欧美韩国| 亚洲午夜精品一区二区三区| 国产成人综合亚洲91猫咪| 日韩毛片在线播放| 中文字幕在线观看亚洲| 欧美区一区二区| 黄色一级一级片| 亚洲色图.com| 日韩大胆视频| 成人激情在线播放| 国产精品一页| 久久嫩草捆绑紧缚| 亚洲精品美女在线观看| 成人mm视频在线观看| 欧美一区二区激情| 国产精品午夜免费| 欧美一区二区三区激情| 国产精品视频yy9099| 亚洲国产专区校园欧美| 少妇视频在线播放| 亚洲国产成人在线播放| 欧美特黄色片| 国产原创popny丨九色| 亚洲色图另类专区| 免费在线高清av| 97人人模人人爽人人少妇| 日韩中文字幕一区二区三区| 精品无码一区二区三区电影桃花 | 国产一二在线播放| 久久久成人精品一区二区三区|