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

国产精品国产福利国产秒拍| 亚洲精品国产综合区久久久久久久| 色一情一乱一伦一区二区三区| 最近国语视频在线观看免费播放| 国产精品伦理久久久久久| 日韩欧美国产成人一区二区| 伊人成色综合网| 欧美成人三区| 成人精品国产一区二区4080| 日本不卡免费高清视频| 一区二区成人免费视频| 国产一级成人av| 欧美美女一区二区在线观看| 青青草精品视频在线| 91这里只有精品| www.性欧美| 亚洲一区二区三区香蕉| 无码人妻一区二区三区线| 中文字幕一区二区三区乱码图片| 亚洲天堂男人天堂女人天堂| 男男受被啪到高潮自述| 我爱我色成人网| 亚洲小说欧美激情另类| 亚洲日本japanese丝袜| 天堂av在线播放| 高清国产一区二区三区| 国产欧美一区二区三区久久| 亚洲天堂视频网站| 黄色av日韩| 久久夜色精品国产| 很污很黄的网站| 国产日韩视频在线| 日韩精品欧美国产精品忘忧草| 亚洲在线观看网站| 欧洲成人一区| 色视频一区二区| 国产日韩一区二区在线| 国产高潮在线| 亚洲午夜电影网| 国产一二三四五| 在线视频91p| 国产精品妹子av| 日韩国产欧美精品| 国产主播福利在线| 国产亚洲欧美日韩在线一区| 激情视频一区二区| 香蕉国产在线视频| 99久久精品免费看国产免费软件| **亚洲第一综合导航网站| 一级爱爱免费视频| 久久99热99| 成人性生交大片免费观看嘿嘿视频| 中国一级片黄色一级片黄| 日日摸夜夜添夜夜添亚洲女人| 欧美做爰性生交视频| av大片在线免费观看| 国产精品一国产精品k频道56| 91大神在线播放精品| 国产婷婷色一区二区在线观看| 国产精品久久久久毛片大屁完整版| 久久久久久亚洲精品| 国产亚洲精久久久久久无码77777| 综合视频在线| 欧美精品成人在线| 国产成人精品a视频一区| 在线亚洲欧美| 日本道色综合久久影院| 成人av网站在线播放| 免费成人av资源网| 91精品啪在线观看麻豆免费| 精品人妻一区二区三区日产乱码| 成人一区二区三区视频| 国产区一区二区三区| 三级av在线播放| 国产日韩欧美亚洲| 手机福利在线视频| 9999热视频在线观看| 欧美午夜xxx| 日本xxxx黄色| 99ri日韩精品视频| 亚洲美女视频网站| 亚洲精品一区二区三区在线播放| 欧美日本中文| 国产99久久精品一区二区| 中文字幕人妻丝袜乱一区三区| 国产麻豆91精品| 精品久久久久久中文字幕动漫| 青春草在线观看| 中文字幕在线一区二区三区| 女人色极品影院| 欧美性xxx| 欧美一区二区三区在线视频| 亚洲一区二区在线免费| 欧美一区二区三区激情视频| 久久伊人免费视频| 久久久国产高清| 久久精品国产**网站演员| 超碰在线97av| a√资源在线| 亚洲成va人在线观看| 麻豆三级在线观看| 欧美一区 二区| 久久精品一本久久99精品| 日韩少妇裸体做爰视频| 国产在线精品一区二区不卡了| 精品免费国产| 亚洲男同gay网站| 欧美性淫爽ww久久久久无| 亚洲欧美综合视频| 欧美www视频在线观看| 91精品国产91久久久| 国产精品主播一区二区| 国产亚洲一区二区三区四区| 国内自拍中文字幕| 久久国内精品| 亚洲人成人99网站| 亚洲日本韩国在线| 国产ts人妖一区二区| 亚洲一卡二卡三卡| 欧美大片1688| 亚洲国产精品va| 永久看片925tv| 精品一区二区免费看| 欧美日韩精品免费观看| 97超碰在线免费| 欧美一激情一区二区三区| 国产精品久久久视频| 久久aⅴ国产紧身牛仔裤| dy888夜精品国产专区| 欧美r级在线| 欧美日韩一区二区三区视频| 一区二区三区美女xx视频| 中文字幕丰满孑伦无码专区| 亚洲电影成人| 成人免费视频视频在| 99在线播放| 51精品秘密在线观看| 免费看黄色av| 日韩avvvv在线播放| 久久久久久草| 蜜桃视频www网站在线观看| 欧美v日韩v国产v| 男人的天堂久久久| 国产精品99久久不卡二区| 91制片厂免费观看| 国产精品久一| 大胆人体色综合| www.久久精品.com| 亚洲一区在线观看免费| 日韩女优在线视频| 亚洲精品四区| 欧美精品亚洲| 成人黄色在线| 久久精品国产99国产精品澳门 | 国产精品激情电影| 成人欧美一区二区| av老司机免费在线| 日韩精品免费综合视频在线播放| 中文字幕av影院| 欧美激情一区二区在线| www.com黄色片| 午夜精品一区二区三区国产 | 99久久精品国产一区色| 亚洲卡通动漫在线| 成人午夜精品无码区| 国产一级久久| 污视频在线免费观看一区二区三区| 成人免费毛片嘿嘿连载视频…| 在线观看欧美日韩| 国产福利小视频| 调教+趴+乳夹+国产+精品| 国内精品久久99人妻无码| 日韩av高清在线观看| 一本一生久久a久久精品综合蜜| 精品99re| 欧美亚洲国产日韩2020| 中文日本在线观看| 欧美成人官网二区| 麻豆视频成人| 亚洲天堂网在线观看视频| 国产精品麻豆视频| 影音先锋资源av| 日韩在线一区二区三区| 国产盗摄视频在线观看| 国产+成+人+亚洲欧洲在线| 欧洲成人免费视频| 蜜桃视频在线观看www社区| 日韩精品中文字幕一区二区三区| av黄色在线播放| 中文字幕亚洲在| 中文在线永久免费观看| 日韩电影免费在线| www.欧美黄色| 欧美丝袜一区| 国产精品一区在线播放| 日本黄色一区| 久久久这里只有精品视频| www亚洲人| 亚洲电影天堂av| 一本色道久久综合亚洲| 精品国产1区2区| 99久久99久久精品国产| www成人在线观看| 亚洲一区二区三区四区精品| 久久三级视频| 高清欧美精品xxxxx| 久久日文中文字幕乱码| 久久精品99| 精品91福利视频| 国产精品爽爽爽| 男人添女人下部高潮视频在线观看 | 成人片免费看| 久久国产精品亚洲| fc2在线中文字幕| 亚洲美女喷白浆| 性一交一乱一精一晶| 欧美日韩一区不卡| 免费黄色网址在线| 亚洲图片欧美色图| 91香蕉视频在线播放| 国产欧美综合在线| 熟女少妇一区二区三区| 成人av综合在线| 无人码人妻一区二区三区免费| 日韩精品久久久久久| 黄色免费观看视频网站| 欧美欧美天天天天操| 久久免费视频2| 日韩欧美二区| 亚洲精品久久区二区三区蜜桃臀 | se69色成人网wwwsex| 91av在线免费观看| 欧美gv在线观看| 国外成人在线播放| 丁香花在线观看完整版电影| 欧美成在线视频| 97caopron在线视频| 久久精品国产v日韩v亚洲| 色多多视频在线观看| 最近中文字幕日韩精品| 高清美女视频一区| 国产亚洲欧洲在线| 国产系列在线观看| 一本一本久久a久久精品综合小说 一本一本久久a久久精品牛牛影视 | 动漫美女无遮挡免费| 国产成人亚洲精品狼色在线| 1314成人网| 国产a久久麻豆| 女性生殖扒开酷刑vk| www.视频一区| 特大黑人巨人吊xxxx| 91视频.com| a级片在线观看| 中文文精品字幕一区二区| 亚洲色图欧美色| 日韩理论在线观看| 老湿机69福利| 亚洲一区二区三区视频在线 | 91精品国产91久久久久久青草| 久久成人免费视频| 欧美xxxx视频| 久久国产综合精品| 一本久道久久综合| 久久久久久影院| 久久久天堂国产精品| 1000部精品久久久久久久久| www.中文字幕在线| 美女任你摸久久| av在线免费观看不卡| 成人avav影音| 欧美 日韩 国产 成人 在线观看| 日本一区二区综合亚洲| 日本裸体美女视频| 亚洲综合久久av| 自拍偷拍欧美亚洲| 欧美日韩一级视频| 亚洲乱码精品久久久久..| 日韩高清a**址| 香蕉视频国产在线观看| 欧美大片在线免费观看| 免费h视频在线观看| 国产精品视频区| 日韩精品一区国产| 欧美综合77777色婷婷| 五月精品视频| www国产黄色| 国产精品自拍在线| 国产在线观看h| 亚洲激情欧美激情| 黄色一级视频免费看| 欧美一区二区二区| 久久99久久| 欧美贵妇videos办公室| 婷婷午夜社区一区| 成人欧美一区二区三区视频 | 2025韩国大尺度电影| 一本久久综合| 一级做a爱视频| 国产香蕉久久精品综合网| 激情五月婷婷小说| 欧美视频三区在线播放| 手机在线观看毛片| 久久精品中文字幕一区| 伊人久久精品一区二区三区| 99电影在线观看| 日韩精品午夜| 国模吧无码一区二区三区| 国产精品一区免费在线观看| av网站免费在线看| 亚洲一区av在线| 国产一区二区三区三州| 亚洲欧美中文日韩v在线观看| 1区2区3区在线视频| 国产精品视频一区国模私拍| 久久porn| www.亚洲成人网| 韩国av一区二区| 黄色免费一级视频| 色狠狠一区二区三区香蕉| 国产18精品乱码免费看| 久久九九热免费视频| 日韩av中字| 正在播放亚洲1区| 中日韩精品视频在线观看| 狠狠色噜噜狠狠狠狠97| 后入内射欧美99二区视频| 久久综合久久八八| a一区二区三区亚洲| 亚洲精品永久www嫩草| 久久免费高清| 人妻丰满熟妇av无码久久洗澡| 亚洲夂夂婷婷色拍ww47| 国产aⅴ爽av久久久久成人| 日韩中文字幕网| 免费视频成人| 夜夜爽www精品| 久久国产夜色精品鲁鲁99| 亚洲午夜精品久久久久久高潮| 欧美性猛交xxxx富婆| 视频二区在线| 欧美一级淫片videoshd| 日韩最新在线| 波多野结衣50连登视频| 久久久不卡影院| 怡红院av久久久久久久| 一区二区欧美在线| 欧美高清免费| 路边理发店露脸熟妇泻火| 国产电影精品久久禁18| 欧美三级免费看| 亚洲精品一区二区三区香蕉| 91福利在线尤物| 精品蜜桃一区二区三区| 丝袜脚交一区二区| 国产精品1区2区3区4区| 6080国产精品一区二区| 在线免费观看a视频| 99国产盗摄| 亚洲欧美日韩国产综合精品二区 | 自拍偷拍国产亚洲| www.麻豆av| 蜜臀久久99精品久久久久宅男 | 不卡高清视频专区| 中日韩黄色大片| 亚洲午夜色婷婷在线| 国产精品第一| 国产 国语对白 露脸| 99久久精品一区二区| 波多野结衣黄色网址| 日韩亚洲欧美中文高清在线| 国产精品久久久久久久久久久久久久久 | 老司机精品久久| 久久精品在线观看视频| 精品国产一区a| 日韩制服诱惑| 日本一级黄视频| 久久久av毛片精品| 国产又粗又猛又黄又爽无遮挡| 欧美激情精品久久久久久免费印度| 美女视频亚洲色图| 亚洲免费999| 亚洲超碰精品一区二区| eeuss影院www在线观看| aaa级精品久久久国产片| 久久一区中文字幕| 欧美做爰爽爽爽爽爽爽| 亚洲欧美制服丝袜| 欧美精品三级在线| 欧美污视频网站| 日韩欧美ww| 国产一区免费视频| 青青国产91久久久久久| 久久久www成人免费毛片| 亚洲欧美中文字幕| 亚洲国产中文在线二区三区免| 日本xxxxxxx免费视频| 一区二区三区日本| h视频在线免费| 免费在线观看91| 成人亚洲一区二区一|