国产剧情视频在线观看-国产剧情麻豆女教师在线观看-国产剧情精品在线观看-国产剧情精品-国产剧情91-国产玖玖在线观看


曙海教育集團(tuán)論壇軟硬件測試專題軟件測試 → 查找嵌入式C語言程序/軟件中的缺陷的多種技術(shù)討論


  共有10641人關(guān)注過本帖樹形打印

主題:查找嵌入式C語言程序/軟件中的缺陷的多種技術(shù)討論

美女呀,離線,留言給我吧!
wangxinxin
  1樓 個性首頁 | 博客 | 信息 | 搜索 | 郵箱 | 主頁 | UC


加好友 發(fā)短信
等級:青蜂俠 帖子:1393 積分:14038 威望:0 精華:0 注冊:2010-11-12 11:08:23
查找嵌入式C語言程序/軟件中的缺陷的多種技術(shù)討論  發(fā)帖心情 Post By:2010-12-15 12:32:28

 

基于模式的靜態(tài)代碼分析、運(yùn)行時內(nèi)存監(jiān)測、單元測試以及數(shù)據(jù)流分析等軟件驗(yàn)證技術(shù)是查找嵌入式C語言程序/軟件缺陷行之有效的方法。上述技術(shù)中的每一種都能查找出某一類特定的錯誤。即便如此,如果用戶僅采用上述技術(shù)中的一種或者幾種來進(jìn)行驗(yàn)證,這樣的驗(yàn)證方法很有可能會漏過對程序中的一些缺陷的檢查。解決此類問題的一種安全和有效的策略就是同時使用上述軟件驗(yàn)證中的所有互補(bǔ)技術(shù)。這樣就能建立起一個牢固的框架來幫助用戶檢查出可能會避開某種特定技術(shù)的缺陷。與此同時,用戶也自然地建立起一個能檢測出關(guān)鍵并且難以查找的功能性錯誤的環(huán)境。

本文將詳盡闡述基于模式的靜態(tài)代碼分析、運(yùn)行時內(nèi)存錯誤檢測、單元測試以及數(shù)據(jù)流分析等自動化技術(shù)共同使用時是如何查找出嵌入式C語言程序/軟件中的缺陷的。本文中將以Parasoft C++test為例來演示上述各項(xiàng)技術(shù)。C++teST是一個經(jīng)廣泛的最佳實(shí)踐證明能提升軟件開發(fā)團(tuán)隊(duì)開發(fā)效率以及軟件質(zhì)量的自動化集成解決方案。

當(dāng)讀者在閱讀本文以及任何時候思考查找到的缺陷時,關(guān)注文中的截圖是很重要的。自動化檢測例如內(nèi)存崩潰和死鎖的缺陷,毫無疑問對任何開發(fā)團(tuán)隊(duì)都是一項(xiàng)必不可少的任務(wù)。盡管如此,最致命的缺陷卻是功能性錯誤,這往往是難以自動發(fā)現(xiàn)的。在本文的結(jié)論部分我們將簡要地討論一下查找這些缺陷的技術(shù)。

情景簡介

為了給出一個具體的示例,我們將就一個我們最近遇到的案例來介紹以及演示我們所推薦的缺陷查找策略:一個運(yùn)行在ARM 板上的簡單傳感器應(yīng)用程序。

假設(shè)我們已經(jīng)創(chuàng)建了該應(yīng)用系統(tǒng),但是當(dāng)我們將程序上載到系統(tǒng)目標(biāo)板上并試圖運(yùn)行該程序時,我們沒有在LCD屏上看到所預(yù)期的輸出。

我們尚不明確系統(tǒng)不能正常工作的原因,因此我們設(shè)法對系統(tǒng)進(jìn)行調(diào)試,但是在目標(biāo)板上進(jìn)行調(diào)試是一件耗時而且煩人的事。因?yàn)槲覀儾坏貌皇謩臃治稣{(diào)試器的結(jié)果并試圖人工判斷出問題的真正原因。或者我們使用一些被證實(shí)能自動定位出錯誤的工具或技術(shù)來幫助我們減輕負(fù)擔(dān)。

從這一點(diǎn)而言,我們要么期待使用調(diào)試器來調(diào)試程序能夠帶來好運(yùn),要么我們嘗試使用一種自動化的測試策略來查找代碼中所存在的錯誤。如果自動化技術(shù)仍然沒有幫助我們查找到錯誤,那么我們不得不回到使用調(diào)試器作為最后的辦法。

基于模式的靜態(tài)代碼分析

這里,我們假設(shè)僅在絕對必要的情況下才使用調(diào)試器進(jìn)行調(diào)試,因此我們從運(yùn)行基于模式的靜態(tài)代碼分析開始。它將查找到如下圖所示的問題:

這是違反了 MISRA 的一個規(guī)則,此違規(guī)說明該處的賦值運(yùn)算符存在一些可疑情況。的確,編程者此處的本意是使用比較運(yùn)算符而不是賦值運(yùn)算符。因此我們將此處檢測到的沖突修改掉,并重新運(yùn)行程序。

我們發(fā)現(xiàn)有了一些改善:一些輸出被顯示在了LCD屏上了。但是,由于一次訪問違規(guī),程序崩潰掉了。因此我們需要再次地做出選擇。我們是應(yīng)該使用調(diào)試器還是繼續(xù)使用自動化的錯誤檢測技術(shù)。由于經(jīng)驗(yàn)告訴我們自動化錯誤檢測技術(shù)能非常高效地檢查出我們當(dāng)前程序所遇到的內(nèi)存崩潰這類問題,因此我們決定使用運(yùn)行時內(nèi)存監(jiān)測來查找問題。

整個程序的運(yùn)行時內(nèi)存監(jiān)測

為了進(jìn)行運(yùn)行時內(nèi)存監(jiān)測,我們使用 C++test 來插裝應(yīng)用程序。這樣的插裝是輕量級的,所以經(jīng)過插裝后的程序適合在目標(biāo)板上運(yùn)行。當(dāng)我們把程序上載到目標(biāo)板上并運(yùn)行經(jīng)過插裝的程序后,我們將結(jié)果下載到PC上,如下的錯誤將被報(bào)告出來:

該結(jié)果指出在第48行代碼處產(chǎn)生了一次讀取數(shù)組越界的錯誤。顯然,msgIndex變量的值肯定超過了數(shù)組的范圍。如果我們隨著堆棧追蹤上一級的原因,我們將發(fā)現(xiàn)此處的打印信息所指示的值的確超出了數(shù)組的范圍(因?yàn)樵谡{(diào)用printMessage()函數(shù)前我們給出了一個錯誤的條件)。我們可以刪除掉這個不必要的條件(value <= 20)以修改這個錯誤。

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value >= 0 && value <= 10) {

index = VALUE_LOW;

} else if ((value > 10) && (value <= 20)) {

index = VALUE_HIGH;

}

printMessage(index, value);

}

然后我們重新運(yùn)行程序,將不會再報(bào)告任何內(nèi)存錯誤。當(dāng)我們把程序上載到目標(biāo)板上時,它似乎如我們預(yù)期那么在工作了。盡管如此,我們?nèi)匀挥幸恍⿹?dān)心。

我們僅查找到我們所執(zhí)行的代碼路徑中的一個內(nèi)存寫溢出實(shí)例,我們憑什么能夠斷定我們尚未執(zhí)行到的代碼就不會有內(nèi)存寫溢出錯誤了呢?如果我們檢查覆蓋率分析,我們就會發(fā)現(xiàn)reportSensorFailure()這個函數(shù)從未被執(zhí)行到。我們有必要對這個函數(shù)進(jìn)行測試,但是具體如何進(jìn)行呢?建立一個調(diào)用該函數(shù)的單元測試用例就是一個不錯的辦法。

在單元測試中使用運(yùn)行時內(nèi)存監(jiān)測:我們使用C++test的測試用例向?qū)韯?chuàng)建一個測試用例的框架,并向其中添加一些測試代碼。然后運(yùn)行該測試用例——以檢查上面提到的未經(jīng)測試的函數(shù),同時打開運(yùn)行時內(nèi)存監(jiān)測功能。使用C++teST,全過程大約只需要數(shù)秒鐘。

結(jié)果標(biāo)明該函數(shù)已經(jīng)被覆蓋到了,但同時也查找到了新的錯誤:

我們的測試用例查找到了更多的內(nèi)存相關(guān)錯誤。很顯然,當(dāng)失敗處理函數(shù)被調(diào)用時,我們的內(nèi)存初始化存在問題(空指針)。通過更進(jìn)一步的分析,我們發(fā)現(xiàn)在reportSensorValue()函數(shù)中存在函數(shù)調(diào)用順序錯誤。finalize()函數(shù)先于printMessage()函數(shù)被調(diào)用,但是finalize()函數(shù)中釋放了printMessage()函數(shù)需要使用的內(nèi)存。

void finalize()

{

if (messages) {

free(messages[0]);

free(messages[1]);

free(messages[2]);

}

free(messages);

}

將函數(shù)調(diào)用順序進(jìn)行修改后,我們重新運(yùn)行程序。

這樣我們就解決了上面報(bào)告中的第一個錯誤。現(xiàn)在我們再來分析報(bào)告中的第二個錯誤:即打印信息中的AccessViolatiONException。產(chǎn)生這個錯誤的原因是相應(yīng)的消息列表未經(jīng)初始化。為了解決該問題,我們在打印該信息前調(diào)用一次initialize()函數(shù)來對其進(jìn)行初始化。經(jīng)修改后的函數(shù)如下所示:

void reportSensorFailure()

{

initialize();

printMessage(ERROR, 0);

finalize();

}

當(dāng)我們再次運(yùn)行該測試用例時,僅有一個任務(wù)被報(bào)告出來:未經(jīng)驗(yàn)證的單元測試用例(an unvalidated unit test case),這其實(shí)并不算一條錯誤。我們只需對輸出進(jìn)行一下驗(yàn)證,以將該測試用例轉(zhuǎn)換為回歸測試。通過創(chuàng)建合適的斷言,C++test會自動為我們完成這些步驟。

接下來我們再次運(yùn)行整個程序。覆蓋率分析告訴我們幾乎整個程序都已經(jīng)被覆蓋到了,并且沒有發(fā)現(xiàn)任何內(nèi)存錯誤。

這樣就結(jié)束了嗎?其實(shí)不然。雖然我們運(yùn)行了整個程序并為未覆蓋到的函數(shù)創(chuàng)建了單元測試用例,但還是有一些路徑是沒有被覆蓋到的。我們?nèi)匀豢梢岳^續(xù)創(chuàng)建單元測試用例,但是若指望通過這樣的方法來覆蓋程序中的所有路徑將耗費(fèi)相當(dāng)長的時間。或者我們使用另外的方法,使用數(shù)據(jù)流分析來對這些路徑進(jìn)行模擬。

數(shù)據(jù)流分析

我們使用C++test的BugDetective來進(jìn)行數(shù)據(jù)流分析,BugDetective能模擬系統(tǒng)中的不同路徑并檢查這些路徑中是否存在潛在的問題。進(jìn)行數(shù)據(jù)流分析后,我們得到如下結(jié)果:

仔細(xì)分析報(bào)告的結(jié)果,我們發(fā)現(xiàn)程序中存在一條未被覆蓋到的潛在路徑可能會造成在finalize()函數(shù)中出現(xiàn)兩次free的操作。在程序中,reportSensorValue()函數(shù)調(diào)用了finalize()函數(shù),然后finalize()函數(shù)調(diào)用了free()。同時,finalize()函數(shù)還會被mainLoop()函數(shù)調(diào)用。我們可以修改finalize()函數(shù)以使其更加智能化,從而修復(fù)這個問題,修改后的代碼如下:

void finalize()

{

if (messages) {

free(messages[0]);

free(messages[1]);

free(messages[2]);

free(messages);

messages = 0;

}

}

現(xiàn)在我們再次運(yùn)行數(shù)據(jù)流分析,得到的結(jié)果將只有兩個問題:

這里我們可能使用了-1作為索引來訪問了數(shù)組。這是由于整型變量index被設(shè)置的初始值為-1,并且存在一條可能通過if語句的路徑在未將該整型變量正確的進(jìn)行初始化之前便調(diào)用了printMessage()函數(shù)。運(yùn)行時分析未檢查到這樣的一條路徑,并且該路徑很有可能在真實(shí)世界中永遠(yuǎn)不可能被執(zhí)行到。這就是靜態(tài)數(shù)據(jù)流分析相對于運(yùn)真實(shí)運(yùn)行時內(nèi)存監(jiān)測最主要的不足:數(shù)據(jù)流分析能檢查出潛在的路徑,這些路徑可能包含在程序?qū)嶋H執(zhí)行過程中不會執(zhí)行到或不存在的路徑。盡管如此,為了做到有備無患,我們刪除了上述的不必要的條件(value>=0)以修改這個潛在的錯誤。

void handleSensorValue(int value)

{

initialize();

int index = -1;

if (value <= 10) {

index = VALUE_LOW;

} else {

index = VALUE_HIGH;

}

printMessage(index, value);

}

相同地,我們也對最后一個報(bào)告的錯誤進(jìn)行相應(yīng)的處理。現(xiàn)在我們再次運(yùn)行數(shù)據(jù)流分析,將不會再有錯誤被報(bào)告出來。

為了確保程序運(yùn)行一切正常,我們重新運(yùn)行整個分析過程。首先,我們開啟運(yùn)行時內(nèi)存監(jiān)測并運(yùn)行應(yīng)用程序,一切表現(xiàn)正常。然后我們開啟內(nèi)存監(jiān)測并運(yùn)行單元測試,一個任務(wù)被報(bào)告出來:

我們的單元測試檢測到reportSensorFailure()函數(shù)的行為已經(jīng)發(fā)生了改變。這是由于我們已經(jīng)對finalize()函數(shù)進(jìn)行了修改——為了糾正之前報(bào)告的一個問題所做的修改。此處報(bào)告的任務(wù)是為了讓我們注意此修改,并提示我們應(yīng)該對測試用例進(jìn)行相應(yīng)的審查,并且確定是否應(yīng)該對代碼或者測試用例進(jìn)行相應(yīng)的修改,以表示這種新的行為實(shí)際上是我們所預(yù)期的行為。在檢查完代碼之后,我們發(fā)現(xiàn)后者(修改)是正確的并且應(yīng)該更新斷言的正確條件。

/* CPPtest_TEST_CASE_BEGIN test_reportSensorFailure */

/* CPPTEST_TEST_CASE_CONTEXT void reportSensorFailure(void) */

void sensor_tests_test_reportSensorFailure()

{

/* Pre-condition initialization */

/* Initializing global variable messages */

{

messages  = 0 ;

}

{

/* Tested function call */

reportSensorFailure();

/* Post-condition check */

CPPTEST_ASSERT(0 == ( messages ));

}

}

/* CPPTEST_TEST_CASE_END test_reportSensorFailure */

作為最終的確認(rèn),我們需要獨(dú)立地運(yùn)行整個程序——在IDE中關(guān)閉掉運(yùn)行時內(nèi)存監(jiān)測來對程序進(jìn)行構(gòu)建。結(jié)果顯示一切如我們所預(yù)期一樣運(yùn)行。

總結(jié)

作為全文的結(jié)尾,讓我們一起對上述各個步驟進(jìn)行一個鳥瞰式的總結(jié)。

首先,我們開發(fā)的程序并未如我么所預(yù)期那樣運(yùn)行,我們不得不在兩種解決方法中選擇一種來查找程序中的錯誤:通過運(yùn)行調(diào)試器或者使用自動錯誤檢測技術(shù)。

如果我們使用調(diào)試器運(yùn)行代碼來查找錯誤,我們將會看到一些很奇怪的現(xiàn)象:程序中的一些變量總是被賦予了相同的值。基于這種現(xiàn)象我們不得不通過排除法來查找問題的原因——即在應(yīng)該使用比較運(yùn)算符的地方我們錯誤地使用了賦值運(yùn)算符。而靜態(tài)代碼分析則能為我們自動地檢查出該邏輯錯誤。運(yùn)行時內(nèi)存分析是不可能檢查出這種錯誤的,因?yàn)檫@種錯誤與內(nèi)存無關(guān)。數(shù)據(jù)流分析也很有可能找不到這類錯誤因?yàn)閿?shù)據(jù)流分析僅僅是通過這些路徑而不會驗(yàn)證這些條件的正確性。

當(dāng)我們解決了這個問題后,程序可以運(yùn)行了,但是仍然還有內(nèi)存相關(guān)的問題。內(nèi)存相關(guān)的問題是很難被調(diào)試器發(fā)現(xiàn)的;當(dāng)用戶使用調(diào)試器調(diào)試程序時,用戶并不知道內(nèi)存的實(shí)際大小。但是自動錯誤檢查工具能夠做到這點(diǎn)。因此,為了查找這些內(nèi)存問題,我們將整個程序進(jìn)行插裝,并使用運(yùn)行時內(nèi)存分析工具來運(yùn)行程序。這樣我們就能知道到底是那一片內(nèi)存發(fā)生了寫溢出錯誤。

盡管如此,在審查覆蓋率分析結(jié)果的時候,我們注意到在目標(biāo)板上測試的時候,并不是全部代碼都被覆蓋到了。通過自動化的工具得到這樣的覆蓋率信息是簡單的,因?yàn)楣ぞ邥詣拥?/p>

跟蹤覆蓋率,但是,如果我們是通過調(diào)試器,就不得不判斷哪一部分程序經(jīng)過了驗(yàn)證。而這通常只能依靠我們?nèi)斯び涗浀姆绞絹韺?shí)現(xiàn)。

當(dāng)工具提醒我們一些代碼未被覆蓋到時,我們決定改變單元測試來額外地增加我們測試執(zhí)行的覆蓋率。這就揭示了程序中另外一些問題。在目標(biāo)系統(tǒng)的正常測試中,覆蓋所有函數(shù)也許是不可能完成的任務(wù),因?yàn)槠渲幸恍┖瘮?shù)可能是硬件的失敗處理函數(shù)或僅在某些小概率的特定情況下才會被調(diào)用的函數(shù)。而對這些函數(shù)的測試對于一些注重安全性的程序而言又是至關(guān)重要的。試想在飛機(jī)上用來處理速度傳感器問題的程序中存在著代碼錯誤:我們會有系統(tǒng)崩潰的危險(xiǎn),而不是導(dǎo)致某個設(shè)備為非工作狀態(tài)。因此,通過創(chuàng)建單元測試用例來覆蓋這類型的執(zhí)行路徑往往是對其進(jìn)行有效測試的唯一方法。

接下來,我們修復(fù)了工具檢查到的所有問題,同時通過驗(yàn)證相應(yīng)的結(jié)果創(chuàng)建了一個回歸測試用例(作為報(bào)告的任務(wù)之一引導(dǎo)我們完成)。然后我們運(yùn)行數(shù)據(jù)流分析來覆蓋在目標(biāo)系統(tǒng)上即便使用單元測試也未執(zhí)行到的路徑。在此之前,我們幾乎已經(jīng)達(dá)到了100%的代碼行覆蓋率,但是我們的路徑覆蓋率卻未達(dá)到這個水平。BugDetective幫我們發(fā)現(xiàn)了這些方面的一些潛在問題。這些問題可能并沒有實(shí)際發(fā)生或者有可能永遠(yuǎn)不會發(fā)生。也許在實(shí)際運(yùn)行時,這些問題僅僅會在當(dāng)其條件滿足的情況下才會出現(xiàn),并且在現(xiàn)實(shí)生活中,這些條件可能永遠(yuǎn)不可能滿足。盡管如此,我們不能保證隨著代碼的升級,應(yīng)用程序不會執(zhí)行到這些路徑。

安全起見,我們?nèi)匀恍薷牧怂鶊?bào)告的問題以排除任何可能影響它的實(shí)際應(yīng)用執(zhí)行的風(fēng)險(xiǎn)。在修改代碼的同時,我們同時也引入了回歸測試,當(dāng)我們再次運(yùn)行單元測試時立即被檢測到。在所有的自動化錯誤檢測方法中,回歸測試是唯一能夠幫助我們檢查到代碼是否發(fā)生了功能性的改變的方法,并且能驗(yàn)證出對代碼進(jìn)行的修改是否引入了功能性的錯誤以及不可預(yù)知的副作用。最后,我們修改了回歸測試套件,并重新測試代碼,發(fā)現(xiàn)一切運(yùn)行正常。

正如讀者所見,我們使用的一切測試方法——基于模式的靜態(tài)代碼分析、內(nèi)存分析、單元測試、數(shù)據(jù)流分析以及回歸測試——并不是相互競爭的關(guān)系,恰好相反,它們是一種互補(bǔ)的關(guān)系。將上述工具結(jié)合使用,它們就是一套具有強(qiáng)大作用的工具集,并為嵌入式C語言程序/軟件提供一個無可比擬的自動化錯誤檢測解決方案。

總而言之,通過自動地查找很多關(guān)于內(nèi)存和其它編碼的缺陷,我們成功地讓程序運(yùn)行起來了。盡管如此,值得注意的是,最危險(xiǎn)的缺陷卻是實(shí)際的功能性錯誤:例如程序并未如所指定的要求運(yùn)行。而不幸的是,這些錯誤往往是非常難以被發(fā)現(xiàn)的。

查找這類缺陷的最好的一個方式就是通過同行代碼審查來實(shí)現(xiàn)。即另指派至少一人來檢查代碼并且審查代碼與需求內(nèi)容的一致性,這樣用戶就能對實(shí)際程序是否會如預(yù)期那樣運(yùn)行有一個很好的*估。

另外一個十分有用的策略是圍繞代碼創(chuàng)建一個回歸測試套件,這能幫助用戶快捷地驗(yàn)證代碼與規(guī)范的一致性。在本文所描述的示例情景中,單元測試被用來強(qiáng)制執(zhí)行應(yīng)用程序級的運(yùn)行時內(nèi)存監(jiān)測所未覆蓋到的代碼:它能覆蓋到當(dāng)前程序的功能性,在此之后,我們對代碼做了一些修改,它能提醒我們代碼出現(xiàn)的相應(yīng)的功能性問題。事實(shí)上,這種單元測試用例應(yīng)該被更早地創(chuàng)建起來:理想情況下,當(dāng)用戶在實(shí)現(xiàn)程序的功能時就應(yīng)該被創(chuàng)建起來。這樣,用戶就能得到更高的覆蓋率并同時構(gòu)建起一個更強(qiáng)壯的“安全網(wǎng)”來捕捉關(guān)鍵的功能性改變。

Parasoft的C++test能幫助用戶完成這兩個任務(wù):從自動化到管理同行代碼審查流程,以及幫助團(tuán)隊(duì)創(chuàng)建,持續(xù)地運(yùn)行并維護(hù)一個高效的回歸測試套件。

關(guān)于Parasoft C++test

Parasoft C++test是一個經(jīng)廣泛的最佳實(shí)踐證明能提升軟件開發(fā)團(tuán)隊(duì)開發(fā)效率以及軟件質(zhì)量的自動化集成解決方案。C++test能進(jìn)行諸如編碼策略增強(qiáng)、靜態(tài)代碼分析、運(yùn)行時內(nèi)存監(jiān)測、自動同行代碼審查以及單元和組件測試,從而為軟件開發(fā)團(tuán)隊(duì)提供一種更加實(shí)用的方法來確保其C以及C++程序能如所預(yù)期那樣工作。C++test可以用于在通用開發(fā)IDE下的桌面平臺中,以及在回歸測試時通過命令行以批處理模式的方式運(yùn)行。同時,C++test還集成了Parasoft的報(bào)告系統(tǒng),該系統(tǒng)能提供具有細(xì)分能力的基于Web 的儀表板,這使得開發(fā)團(tuán)隊(duì)根據(jù)C++test的測試結(jié)果和其他的一些關(guān)鍵進(jìn)程指標(biāo)來更加方便地跟蹤項(xiàng)目的狀態(tài)和趨勢。

通過在宿主機(jī)上進(jìn)行大量的測試以及在目標(biāo)系統(tǒng)中進(jìn)行的平滑的驗(yàn)證,C++test能夠幫助軟件開發(fā)團(tuán)隊(duì)減少花在嵌入式系統(tǒng)開發(fā)中的時間、精力以及成本。隨著代碼在宿主機(jī)上的構(gòu)建,C++test的自動化框架使得開發(fā)者能在目標(biāo)硬件系統(tǒng)尚未準(zhǔn)備好的情況下就開始測試以提升代碼質(zhì)量。這大大地縮短了花在目標(biāo)系統(tǒng)上測試的時間。早期在宿主機(jī)上構(gòu)建的測試套件可以被重用來在仿真器或真實(shí)的目標(biāo)板上驗(yàn)證程序的功能性。


支持(0中立(0反對(0單帖管理 | 引用 | 回復(fù) 回到頂部

返回版面帖子列表

查找嵌入式C語言程序/軟件中的缺陷的多種技術(shù)討論








簽名
国产剧情视频在线观看-国产剧情麻豆女教师在线观看-国产剧情精品在线观看-国产剧情精品-国产剧情91-国产玖玖在线观看
<dfn id="is4kg"></dfn>
  • <ul id="is4kg"></ul>
  • <abbr id="is4kg"></abbr>
  • <ul id="is4kg"></ul>
    <bdo id="is4kg"></bdo>
    久久久亚洲精选| 欧美国产激情18| 国产精品一香蕉国产线看观看| 产国精品偷在线| 亚洲一区二区三区精品视频| 国产精品视频公开费视频| 免费99视频| 日韩av片电影专区| 国产无套精品一区二区| 97视频在线看| 看欧美日韩国产| 欧美一级bbbbb性bbbb喷潮片| 亚洲高清乱码| 欧美自拍资源在线| 亚洲精品tv久久久久久久久| 91久久国产婷婷一区二区| 欧美国产第一页| 欧美日韩国产综合视频在线| 久久精品国产精品国产精品污 | 国产成人啪精品视频免费网| 久久国产欧美精品| 国产精品久久久久久网站| 色一情一区二区三区四区 | 91人人爽人人爽人人精88v| 在线免费观看成人| 99九九视频| 欧美一乱一性一交一视频| 免费久久久一本精品久久区| 国产中文字幕91| 久久久久久久色| 久久久综合亚洲91久久98| 国产精品丝袜高跟| 97视频人免费观看| 亚洲人成网站在线观看播放| 国产一区精品视频| 国产在线日韩在线| 欧美一区二区三区免费观看| 亚洲国产精品久久久久久女王| 91九色在线视频| 秋霞av国产精品一区| 在线观看成人av电影| 国产一区二区高清视频| 成人福利视频在线观看| 热门国产精品亚洲第一区在线| 五月天久久狠狠| 国产精品v欧美精品∨日韩| 国产精品福利小视频| 久久久欧美精品| 欧美精品国产精品久久久| 91免费欧美精品| 青青草精品毛片| 欧美激情亚洲自拍| 色噜噜狠狠一区二区三区| 国产精品青青草| 91精品在线观| 国产欧美在线观看| 国产成人在线精品| 青青草原一区二区| 91精品国产高清| 色与欲影视天天看综合网 | 色999日韩自偷自拍美女| 久久久久久这里只有精品| 欧美一级淫片播放口| 欧美黑人视频一区| 日韩一本精品| 久久综合狠狠综合久久综青草| 国产精品免费区二区三区观看| 国产日韩欧美中文在线播放| 国产精品成人观看视频国产奇米| 国内外成人免费激情在线视频| 亚洲国产日韩综合一区| 亚洲国产高清国产精品| 性欧美大战久久久久久久免费观看 | 亚洲欧美日韩国产yyy| 国产亚洲欧美一区二区三区| 国产精品久久精品视| 亚洲综合国产精品| 99re国产视频| av在线不卡一区| 99九九视频| aa成人免费视频| 99精品欧美一区二区三区| 91免费在线观看网站| 亚洲a一级视频| 91视频免费在线| 92看片淫黄大片看国产片| 亚洲一区二区三区久久 | 欧美专区在线播放| 热99久久精品| 国产精品福利在线| 91色精品视频在线| 超碰97人人人人人蜜桃| 久久精品久久精品国产大片| 日韩久久不卡| 欧美极度另类性三渗透| 97av在线播放| 国产精品爽黄69天堂a| 2019国产精品视频| 国产日韩精品久久| 色婷婷精品国产一区二区三区| 亚洲欧美日韩在线综合| 羞羞色国产精品| 国产成人鲁鲁免费视频a| 国产日韩欧美中文| 国产精品手机视频| 日韩精品欧美一区二区三区| 色综合男人天堂| 欧美在线视频免费观看| 国产精品美乳在线观看| 亚洲影影院av| 麻豆成人av| 欧美国产在线视频| 国产一区自拍视频| 国产精品18久久久久久麻辣| 国产欧美精品在线播放| 97se亚洲综合在线| 免费看成人片| 久久久久免费视频| 国产精品久久在线观看| 北条麻妃高清一区| 日韩欧美99| 国语自产精品视频在线看| 国产精品高潮呻吟久久av野狼| 成人久久一区二区| 国产一区二区三区黄| 色综合视频二区偷拍在线| 97视频免费在线观看| 国产精品久久久久免费a∨| av日韩免费电影| 亚洲高清乱码| 国产精品久久久久久久av电影 | 亚洲 国产 欧美一区| 久久男人av资源网站| 国产91精品最新在线播放| 91精品免费视频| 久久久久高清| 97人人模人人爽人人喊中文字 | 97se国产在线视频| 欧美下载看逼逼| 国内精品视频久久| 成人激情视频在线| 日本视频一区在线观看| 欧美专区在线播放| 国产专区一区二区三区| 久久噜噜噜精品国产亚洲综合| 国产精品爽爽爽爽爽爽在线观看| 久久国产欧美精品| 欧美在线观看一区二区三区| www国产亚洲精品| 伊人天天久久大香线蕉av色| 国产噜噜噜噜久久久久久久久| 97se国产在线视频| 久久久久久高潮国产精品视| 国产精品中文久久久久久久| 精品国产一区二区三区免费| 97视频免费看| 国产精品乱码视频| 668精品在线视频| 精品无码久久久久久久动漫| 欧美中在线观看| 久久精品日韩精品| 国产成人在线一区二区| 欧美日韩视频在线一区二区观看视频| 91av在线免费观看| 激情小说综合区| 3344国产精品免费看| 欧美一二三四五区| 国产精品r级在线| 久久久久久久久四区三区| 成人久久18免费网站图片| 91免费人成网站在线观看18| 中文字幕久久一区| 国产精品久久91| 国产视频一区二区不卡| 久久久亚洲国产| 91中文字幕在线| 蜜桃传媒视频麻豆一区| 一区二区不卡在线| 国产精品久久久久久久久久久久久久 | 亚洲国产欧美不卡在线观看 | 国产成人精品a视频一区www| 99久久自偷自偷国产精品不卡| 一区国产精品| 成人h视频在线观看播放| 性欧美精品一区二区三区在线播放| 国产一区二中文字幕在线看| 亚洲精品一区二区三区四区五区| 91在线免费观看网站| 久久久久久久久久av| 国产精品麻豆免费版| 国产精品ⅴa在线观看h| 一本色道久久99精品综合| 99在线国产| 国产成人精品电影| 欧美激情aaaa| 欧美不卡1区2区3区| 成人情趣片在线观看免费| 欧美激情免费观看| 久久99国产精品99久久| 国产欧美日韩高清| 91国产高清在线| 日本高清久久一区二区三区| 亚洲一区国产精品| 久久综合给合久久狠狠色| 国产欧美精品日韩| 欧美一区二区视频97| 日韩免费中文专区| 国内精品久久久久久久果冻传媒| 国产精品久久久久久久久久ktv | 国语自产偷拍精品视频偷| 久久青青草原| 在线视频福利一区| 在线视频一区观看| 欧美亚州在线观看| 超碰97网站| 亚洲欧美电影在线观看| 亚洲人成影视在线观看| 亚洲一区二区中文字幕| 国产福利不卡| 国产精品www网站| 欧美极品少妇与黑人| 欧美日韩在线一二三| 国产成人精品免费视频大全最热| 国产精品久久中文| 88xx成人精品| 欧美激情中文字幕在线| 视频二区一区| 久久久亚洲综合网站| 国产在线一区二区三区欧美| 亚洲最大av网| 成人福利网站在线观看| 国产精品久久二区| 日本精品一区二区三区在线播放视频 | 国产精品入口福利| 欧美最猛性xxxxx(亚洲精品)| 欧美激情伊人电影| 欧美激情乱人伦一区| 在线视频不卡一区二区| 亚洲欧美国产不卡| 亚洲国产一区二区三区在线播| 青娱乐一区二区| 欧美精品免费观看二区| 欧美日韩精品免费看| 欧美日韩精品久久久免费观看| 久久av一区二区三区亚洲| 国产精品免费观看高清| 国产日韩欧美一区二区| 国产精品美女诱惑| 久久另类ts人妖一区二区| 免费成人看片网址| 欧美在线一二三区| 性欧美精品一区二区三区在线播放| 视频一区国产精品| 亚洲一区3d动漫同人无遮挡| 一区二区视频国产| 久久免费国产视频| 午夜精品国产精品大乳美女| 97久久久久久| 日本一区二区在线免费播放| 国产成人av在线| 国产欧美精品日韩精品| 91福利视频导航| 国产精品日韩一区二区免费视频| 久久精品国产第一区二区三区最新章节| 国产精品日本一区二区| 久久综合九色99| 亚洲精品成人久久久998| 欧美激情网友自拍| 欧美做爰性生交视频| 国产精品美女www爽爽爽视频| 蜜桃视频在线观看成人| 国产精品扒开腿做爽爽爽视频| 国产精品久久久亚洲| 亚洲free嫩bbb| 久久影视中文粉嫩av| 四虎永久国产精品| 欧美激情va永久在线播放| 国产91av在线| 欧美综合在线第二页| 成人激情免费在线| 精品不卡在线| 久久久久一区二区三区| 正在播放一区二区三区| 欧洲成人免费aa| 亚洲a成v人在线观看| 国产一区喷水| 一区二区三区在线观看www| 91高潮在线观看| 日本高清视频一区| 91综合免费在线| 蜜桃传媒视频第一区入口在线看| 欧美激情在线播放| 在线免费一区| 国产999精品久久久影片官网| 国产精品无av码在线观看| 97人人模人人爽人人喊38tv| 好看的日韩精品视频在线| 另类小说综合网| 亚洲综合色av| 极品校花啪啪激情久久| 欧美国产日韩中文字幕在线| 国内精品久久久久久影视8| 92国产精品视频| 欧美乱偷一区二区三区在线| 亚洲精品一卡二卡三卡四卡| 久久精品一二三区| 欧美在线一区二区三区四区| 97视频网站入口| 国产精品高潮呻吟久久av无限| 97成人超碰免| 国产不卡一区二区三区在线观看| 精品不卡一区二区三区| 国产成人中文字幕| 色视频一区二区三区| 97视频在线观看亚洲| 久久99久久99精品蜜柚传媒| 污视频在线免费观看一区二区三区| 欧美交受高潮1| 国产精品国产福利国产秒拍| 精品一区二区三区视频日产| aa日韩免费精品视频一| 国产成人精品一区二区在线| 国产在线98福利播放视频| 成人在线观看网址| 一区二区三区四区在线视频| 国产精品夫妻激情| 欧美大香线蕉线伊人久久国产精品| 久久99精品国产99久久| 杨幂一区欧美专区| 91精品久久久久久久久中文字幕 | 色综合久久88色综合天天提莫| 国产激情久久久久| 九九久久99| 国产成人小视频在线观看| 免费日韩电影在线观看| 国产精品678| 亚洲成人自拍| 成人天堂噜噜噜| 一区二区冒白浆视频| 久久国产日韩欧美| 久久精品二区| 国产精品7m视频| 视频一区二区精品| 国产视频999| 亚洲一区二区三区涩| 亚洲一区二区免费在线| 久久久久久中文字幕| 日本成人黄色片| 日韩欧美精品一区二区三区经典| 国产在线久久久| 亚洲国产一区二区三区在线播| 91视频国产一区| 国产做受高潮69| 久久精品日韩精品| 亚洲欧美日产图| 欧美在线视频网站| 亲子乱一区二区三区电影| 国产欧美一区二区三区不卡高清| 欧美一级黄色网| 激情小说综合区| 国产免费一区二区三区在线能观看| 亚洲一区二区三区色| 热re99久久精品国99热蜜月| 免费亚洲一区二区| 日韩和欧美的一区二区| 97超碰资源| 2020久久国产精品| 日韩在线电影一区| 福利视频一区二区三区| 国产mv免费观看入口亚洲| 日韩视频精品| 国产中文一区二区| 国产在线视频91| 欧洲永久精品大片ww免费漫画| 日韩av电影在线观看| 懂色av一区二区三区在线播放| 国产成+人+综合+亚洲欧洲| 欧美激情a∨在线视频播放| 精品日产一区2区三区黄免费| 国产精品免费福利| 97在线看免费观看视频在线观看| 91久久精品一区二区别| 欧美性xxxx69| 久久久亚洲精选| 四虎永久国产精品| 丝袜美腿玉足3d专区一区| 亚洲春色在线视频| 99re在线观看| 国产精品揄拍一区二区| 午夜精品在线观看| 一区精品视频| 在线亚洲美日韩| 91久久精品美女高潮| 成人国产精品一区| 欧美中文字幕在线播放| 亚洲一区亚洲二区| 日产国产精品精品a∨| 曰韩不卡视频| 日韩高清国产精品| 新呦u视频一区二区| 精品蜜桃传媒| 春色成人在线视频| 91老司机在线| 成人综合网网址| 国产精品视频一区国模私拍| 欧美一区二区三区精品电影| 97精品视频在线播放| 久久久久久久一区二区三区| 亚洲一区二区高清视频| 日韩欧美精品久久| 日韩亚洲不卡在线| 亚洲7777| 在线观看日韩片| 色综合男人天堂| 亚洲综合第一| 欧美精品成人91久久久久久久| 欧美日韩一区在线观看视频| 日本一区二区三区www| 特级西西444www大精品视频| 亚洲一区二区三区加勒比| 先锋影音网一区| 在线视频不卡一区二区三区| 久久久久久久久91| 欧美综合国产精品久久丁香| 日本欧美黄网站| 国产精品久久久久久久久久久不卡 | 欧美日韩国产精品一区二区| 久久综合久久综合这里只有精品| 精品乱子伦一区二区三区| 久久久久成人精品免费播放动漫| 免费日韩电影在线观看| 亚洲精品国产精品国自产观看| 视频一区视频二区视频| 欧美放荡办公室videos4k| 久久久中文字幕| 日韩av片电影专区| 91精品国产综合久久香蕉最新版| 91视频88av| 精品免费国产| 一区二区欧美日韩| 2019亚洲日韩新视频| 国产精品免费久久久久影院| 亚洲free嫩bbb| 欧美激情www| 中文字幕日韩精品久久| 欧美壮男野外gaytube| 91久久久在线| 免费中文日韩| 久久久噜噜噜久久| 国产精品久久久久7777婷婷| 成人国产1314www色视频| 精品一区二区三区日本| 亚洲精品乱码久久久久久蜜桃91| 欧美激情久久久久久| 国产91色在线|| 99蜜桃在线观看免费视频网站| 蜜桃av久久久亚洲精品| 久久久亚洲成人| 成人性教育视频在线观看| 狠狠干一区二区| 中文字幕一区二区三区四区五区| 日本午夜人人精品| 成人网在线视频| 91在线看网站| 天堂av一区二区| 2019av中文字幕| 91精品国产一区二区三区动漫| 欧美日韩电影一区二区| 97免费在线视频| 91在线观看免费观看| 日本在线高清视频一区| 欧美性在线观看| 99国产在线| 中文字幕一区综合| 国产日韩换脸av一区在线观看| 久久99精品久久久水蜜桃| 久久久免费在线观看| 成人性生交大片免费看视频直播| 久久精品国产一区二区三区不卡| 久久久最新网址| 91视频最新| 中文字幕日韩精品一区二区| 国产一区私人高清影院| 欧美极品色图| 1769国内精品视频在线播放| 亚洲aaaaaa| 欧美激情在线观看视频| 2022国产精品| 亚洲日本无吗高清不卡| 国产欧美最新羞羞视频在线观看| 日本不卡一区二区三区视频| 国产精品va在线| 欧美视频观看一区| 国产成人精品日本亚洲专区61| 久久99精品久久久水蜜桃| 欧美专区第一页| 欧美日韩在线一二三| 国产精品女主播| 亚洲一区二区三区加勒比| 92看片淫黄大片欧美看国产片| 亚洲午夜精品久久| 91久久久一线二线三线品牌| 97精品国产97久久久久久春色| 好看的日韩精品视频在线| 国产福利成人在线| 日韩免费三级| 亚洲最大成人网色| 18性欧美xxxⅹ性满足| 快播亚洲色图| 国产精品自拍小视频| 亚洲在线欧美| 99re视频在线观看| 欧美一级淫片播放口| 欧美凹凸一区二区三区视频| 国产精品视频99| 一区二区三区四区在线视频| 波多野结衣一区二区三区在线观看 | 古典武侠综合av第一页| 97色在线视频观看| 欧美一区二区视频17c| 91精品久久久久久久久久久久久久| 一区二区三区四区欧美日韩| αv一区二区三区| 日本一区二区不卡| 亚洲国产欧洲综合997久久| 91成人免费视频| 国产97在线播放| 曰韩不卡视频| 久久久久久久久久久一区| 国产日韩精品在线播放| 久久久女人电视剧免费播放下载| 久久久久久九九| 92裸体在线视频网站| 日本一区二区不卡| 中国成人亚色综合网站| 久久久久九九九| 亚洲一区二区三区成人在线视频精品| 欧美在线免费视频| 色综合久久精品亚洲国产 | 欧美日韩精品综合| 99久久精品免费看国产四区| 国产精品美女久久| 欧美亚洲午夜视频在线观看| 伊人久久青草| 日韩电影免费观看在| 国产一区免费在线| 51国偷自产一区二区三区的来源| 国产大片精品免费永久看nba| 欧美精品激情在线观看| 日本一区二区在线视频| 国产精品视频免费观看| 91牛牛免费视频| 91精品国产色综合久久不卡98| 国产欧美在线视频| 欧洲s码亚洲m码精品一区| 欧美精品久久一区二区 | 欧美性受xxx| 久久久久久亚洲精品中文字幕| 免费国产一区| 狠狠色综合欧美激情| 国产成人精品一区二区三区福利| 91精品久久久久久久久久久久久久 | 人人澡人人澡人人看欧美| 中国成人亚色综合网站| 日本午夜精品一区二区| 九色91国产| 国产一区二区免费电影| 动漫3d精品一区二区三区 | 亚洲一区二区免费视频软件合集 | 亚洲在线免费看| 国产日产欧美精品| 国产精品一二区| 国产精品麻豆va在线播放| 国产精品久久视频| 国产精品久久久久久五月尺| 国产精品69av| 国产精品国产三级国产专播精品人 | av成人免费观看| 96久久精品| 超碰97在线资源| 99久热re在线精品996热视频| 51国产成人精品午夜福中文下载| 91在线观看免费高清| 91在线观看免费高清完整版在线观看| 国产在线一区二区三区| 91亚洲精品久久久| 成人午夜电影免费在线观看| 国产精品手机在线| 久久久久国产精品视频| 欧美一区1区三区3区公司| 欧美在线播放一区| 天天综合狠狠精品| 亚洲制服中文| 久久久亚洲福利精品午夜| 欧美性在线观看| 国产精品高潮呻吟久久av黑人| 国产精品激情av在线播放| 成人av电影天堂| 国产精品区一区二区三在线播放| 九9re精品视频在线观看re6|