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

讓我印象深刻并很喜歡的一個bug

譯文
開發
很高興發現了這個問題,這是一次很好的學習過程。自那以后,我對于如何聲明函數很謹慎。但愿這是好事。

【51CTO.com快譯】那是在2013年11月初,我和朋友在準備參加一年一度的美國計算機協會(ACM)主辦的國際大學生程序設計競賽(ICPC)區域賽,選擇的項目是各種算法和數據結構。據我了解,跳表并不經常用于編程比賽,但是它是一種用戶維護有序元素的數據結構。我們認為將跳表添加到自己的庫也許是個好主意。(注意:我們選擇的編程語言C++已經通過其標準庫,提供了平衡二進制搜索樹,但是不支持擴增(augmentation),編程比賽中經常需要用到擴增。)

于是,我們晚上就開始行動,將跳表添加到自己的庫。我的朋友找到了舊的實現方法,將低級C編寫的程序轉換成更易使用的高級C++。完成后就開始測試它,首先我們做了幾個小小的手動測試,沒有發現問題。然后進行更全面測試,開始生成大量的隨機性測試用例(test case),將跳表的結果與C++的set進行比較。看了看一些舊的Github提交代碼后,我發現這個程序看起來基本上是這樣:

讓我印象深刻并很喜歡的一個bug

因代碼中某個地方有錯誤(bug),引起了這個內存損壞。我們花了好長時間分析代碼,查找可能解釋得通的原因,但是結果一無所獲。后來想到也許是轉換過程中犯了錯誤,我們就回過頭去檢查原始的實現方法,修改了測試生成器,然后使用低級接口再次運行程序。這回運行起來很順暢,沒有錯誤!我們更加確定是轉換過程中犯了某個錯誤,接著我們回到轉換后的代碼,更細致地分析代碼,但由于毫無進展。***我們決定掏出大家伙用GDB調試器(https://en.wikipedia.org/wiki/GNU_Debugger)來運行程序。

我的朋友在GDB方面比較有經驗,就讓他來帶路。我的記憶有點模糊,但這大約發生了什么。我們觀察到的***件事情是錯誤出現在一個節點的析構函數中,接著在那里釋放一些內存。遺憾的是,并沒有查出為何會出現這樣的情況。在反復的調試器中,我們得到了一個大突破。跳表的析構函數似乎被調用了不止一次。這就可以解釋我們看到節點的析構函數出現奇怪的行為以及內存錯誤。在修改了代碼輸出一些調試信息后,我們證實了情況就是這樣,但是那也很奇怪。我們沒有顯式調用析構函數,所以它唯一被(隱式)調用的地方是在程序末尾。

于是從頭查閱代碼,終于明白了析構函數為什么莫名其妙地被調用了多次。我還記得,我和朋友同時發現了這點,我們互相對視一秒鐘之后哈哈大笑,意識到我們有多可笑。

根源就出在size()函數上。不是跳躍表的size()函數,而是我在代碼開頭定義的那個size()函數,如下所示:

讓我印象深刻并很喜歡的一個bug

我之前定義這個便利函數是為了消除關于帶符號整數和無符號整數之間的比較的一些警示信息,在測試代碼中用了它幾次。比如說,確保跳躍表中的元素數量 (t1)等于set中的元素數量(t2)時,我們是這么做的:

讓我印象深刻并很喜歡的一個bug

那么,這個函數到底錯在哪里呢?問題在于,參數x由值傳遞(這是C++中的默認模式),而不是由引用傳遞。這意味著每當我們調用函數,給它傳遞某個對象(這里是跳躍表),就會發生下列情況:

1. 對象被拷貝

2. 副本被傳遞給函數。

3. 函數使用對象的這個副本來執行;當函數終結時,

4. 副本(通過調用析構函數)被銷毀。

所以,每當測試代碼調用size(t1),它就會使用拷貝構造函數,對跳躍表作一份拷貝,然后調用副本的析構函數。

未實現拷貝構造函數或析構函數函數時,C++會提供一個健全的默認實現。實際上,如果我們剛使用了默認的實現,就不會有這個錯誤。然而,當對象分配內存(使用跳躍板就是這樣),用戶通常想自定義實現拷貝構造函數,以便拷貝已分配內存的實際值(而不是默認的實現那樣僅僅拷貝指針)。但是我們剛實現了析構函數,而不是拷貝構造函數。于是當跳躍表的副本被拷貝后(為了size()函數),默認的拷貝構造函數只是將指針拷貝過去。然后,副本的析構函數被調用后,它釋放指針的內存。而由于這是跳躍板的原始副本使用的內存,現在它不可以被使用。但測試代碼繼續下去,因而遇到許多內存錯誤,最終崩潰。

但是這不是size()函數引起的唯一不良反應。不妨考慮下面這段代碼:

讓我印象深刻并很喜歡的一個bug

它創建了100萬個整數的向量,然后迭代處理這個向量,將每個值設為42。這通常會在你的普通計算機上運行幾毫秒(我的計算機上實際用了4毫秒)。然而,由于ize()的參數由值傳遞,100萬個元素的向量拷貝到循環的每次迭代。又由于有100萬次迭代,這要花很長的時間。實際上,這在我的計算機上耗時13分鐘38秒。

不管怎樣,不妨回到我和朋友認識到什么引起內存錯誤的那一刻。我不僅認識到當前編寫的size()函數可能有什么影響,我還明白:由于這個函數實際上來自默認C++模板(我將編輯器配置成這樣每當創建一個新的C++文件,自動導入該模板),這個錯誤就會出現在我長期以來編寫的基本上所有C++代碼里面。至少幾個月來是這樣!

當然,這解決起來輕而易舉,從提交的這段代碼(https://github.com/SuprDewd/CompetitiveProgramming/commit/a72e4ec132d595beb7614c11e41bebf76e12f937)可以看出,我們的測試程序在解決了這個問題后運行起來毫無問題。

 

后記

很高興發現了這個問題,這是一次很好的學習過程。自那以后,我對于如何聲明函數很謹慎。但愿這是好事。

不過,我對這件事做了反思。

為何這個錯誤會出現?正如前所述,我開始使用這個size()函數的原因是為了消除編譯器警告信息。在C++的標準庫中,大多數容器的size()函數返回類型size_t的整數,這是無符號整數。所以,如果你編譯下面這樣的一段代碼:

  1. for (int i = 0; i < v.size(); i++) { 
  2.  

編譯器就會給出關于帶符號整數和無符號整數之間的比較的警告信息。看到大量這樣的警告信息很快會讓人乏味。另一個相關問題如下。比如說你想迭代處理除容器***一個元素之外的所有部分。你可能這樣來實現這個部分:

 

  1. for (int i = 0; i < v.size() - 1; i++) { 
  2.  

 

但是容器為空時,這段代碼無法正確運行。由于v.size()返回的是無符號整數(這里值為零),減1會下溢,給出size_t的***表示值,而不是預期的-1。這反過來會導致***循環。

要解決上述兩個問題,一個明顯的簡單辦法就是將結果轉換為整數,如下所示:

 

  1. for (int i = 0; i < (int)v.size() - 1; i++) { 
  2.  

 

但是由于經常為循環編寫這種代碼,每次編寫會很煩人。我認為在編程比賽界很常見的另一個辦法是,定義諸如下列宏命令之類的命令:

 

  1. #define SZ(c) (int)(c).size() 

然而像下面這樣使用它:

 

  1. for (int i = 0; i < SZ(v) - 1; i++) { 
  2.  

 

當我開始參加編程比賽時,可能見過這個宏命令好幾次;有時我決定編寫自己的版本。我覺得SZ不好看,更習慣于鍵入size,于是我想繼續這么做。但是用名稱size創建宏命令會有點危險,因為size是個常見的變量名稱,這會引起麻煩。于是,我走另一條路,創建了下列函數,而不是宏命令:

 

  1. template <class T> int size(T x) { return x.size(); } 

我不確信為什么沒有讓參數由引用傳遞,但是確信在我開始參加編程比賽之前(因而在我編寫這個函數之前)知道區別所在。但是很容易犯這個錯誤,哪怕是經驗豐富的編程人員,要是他在實現這種看似微不足道的函數時沒有高度集中注意力的話。

我還想知道為什么之前沒有遇到問題。一個原因可能是,我缺乏經驗,不知道這種循環會運行多快。另一個因素也是這個事實,參加編程比賽的程序員通常沒必要為編寫拷貝構造 函數和析構函數而操心。進程終結時,通常我們就讓C++運行時環境釋放所有的內存。至少我確信我在發現這個錯誤時,我在庫中的數據結構沒有一個實現這些構造函數。

我試著準確查明何時開始使用這個函數。我查看了在TopCoder和Codeforces上的提交歷史。在TopCoder上,我發現沒有在2011年10月26日的比賽中使用這個函數(遺憾的是,你不得不登錄到TopCoder才能訪問鏈接)。然而,我在2011年11月12日的比賽中使用了那個函數。發覺這一點讓我崩潰。這個錯誤出現在了我從2011年11月12日直到2013年11月3日的所有編程比賽解決方案當中。那可是我參加編程比賽的頭兩年!

舉例說,我發現了提交的這個代碼(http://codeforces.com/contest/134/submission/914840),當時是為了解決參與Codeforces的第二場比賽的***個問題。我試圖解決頭兩個問題,但結果證明我的兩個解決方法都速度太慢了。然而,就我提交的解決***個問題的方案而言,我只是增添了那個字母(&),讓size()函數由引用傳遞,提交的內容通過了。我為自己過去的愚蠢而感到可笑。

最近我又分析了幾年前解決不了的一個問題,不過試著實現一種解決辦法。我仔細閱讀了問題,提出了解決辦法。我還記得,那是我***次想到的同一個解決方法。由于有點懶,我找到了原來的代碼,而不是從頭開始實現一切。我分析了代碼,似乎很正常。于是我提交了,但結果運行速度太慢了。我花了好長時間來檢查代碼,但是不明白為何這么慢。但突然之間,我發現了問題之所在。那個舊的、壞的size()函數,我添加了&,重新提交了,通過了!

盡管我以為自己在多年前解決了這個錯誤,但直到今天它仍在為我敲警鐘!

原文標題:My favorite bug

作者:Bjarki Ágúst Guðmundsson

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

責任編輯:陶家龍 來源: 51CTO
相關推薦

2023-10-04 00:18:00

云原生Go語言

2024-01-03 15:09:21

云原生Go語言

2022-04-05 00:18:33

工具終端命令行

2015-09-21 09:42:57

程序員教誨

2020-07-16 07:47:36

ZooKeeperNettyNIO

2020-06-16 17:31:41

SQLPython技術

2022-11-30 09:18:51

JavaMyBatisMQ

2021-04-22 07:47:47

JavaJDKMYSQL

2021-12-17 10:58:20

前端開發工具

2022-05-16 08:42:26

Pandasbug

2021-03-23 18:01:14

SQL數據庫前端

2021-02-02 05:41:16

底層設計頂層

2022-04-06 08:47:03

Dubbo服務協議

2021-09-13 08:41:52

職場互聯網自閉

2021-09-14 14:39:46

物聯網建筑工人IoT

2018-07-04 13:36:53

程序員項目數據庫

2013-06-18 11:37:42

XFSRHEL 6.4

2012-05-09 13:45:04

jQuery

2018-01-29 21:56:28

Bug程序程序員

2023-11-28 12:00:22

應用程序API
點贊
收藏

51CTO技術棧公眾號

69国产精品视频免费观看| 成人一区二区三区四区| 中日韩精品一区二区三区| а√在线中文网新版地址在线| 国产成人精品免费看| 97在线视频免费| 男人操女人动态图| 青青久久精品| 亚洲一本大道在线| 色婷婷综合久久久久中文字幕| 中文字幕在线观看你懂的| 国产探花一区二区| 欧美日韩一区二区电影| www.-级毛片线天内射视视| 亚洲精品中文字幕成人片| 影院欧美亚洲| 在线激情影院一区| 特级特黄刘亦菲aaa级| 小早川怜子影音先锋在线观看| 日本一区二区三区国色天香 | 激情久久五月| 亚洲人午夜精品| 在线免费黄色网| ****av在线网毛片| 国产精品毛片无遮挡高清| 波多野结衣成人在线| 久久精品国产成人av| 亚洲视频电影在线| 亚洲精品之草原avav久久| 国产欧美一区二| 亚洲天堂免费电影| 一区二区视频免费在线观看| 国产精品久久久久久久免费大片 | 中文字幕乱码av| 秋霞影视一区二区三区| 欧美精品精品一区| 黄色高清无遮挡| 波多野结依一区| 亚洲欧美偷拍卡通变态| 欧美午夜精品久久久久久蜜| 精品国产va久久久久久久| 蜜臀av一区二区三区| 高清亚洲成在人网站天堂| 操她视频在线观看| 欧美男gay| 亚洲国产天堂久久国产91 | 日韩美女在线视频| 亚洲欧美日韩综合网| 一二三四视频在线中文| 亚洲综合视频在线| 一区二区欧美日韩| 免费在线超碰| av日韩在线网站| 99视频在线| www.av黄色| 国产美女精品人人做人人爽 | 国产精品500部| 欧美不卡视频| 日韩中文字幕国产| 一级黄色片网址| 欧美猛男男男激情videos| 亚洲福利视频二区| 妖精视频一区二区| 99re热精品视频| 日韩欧美一区中文| 久草福利视频在线| 91在线亚洲| 在线免费av一区| 丰满少妇在线观看| 精品成人免费一区二区在线播放| 色综合一个色综合亚洲| 国产淫片免费看| 特黄毛片在线观看| 懂色av影视一区二区三区| 日本免费黄视频| 天天综合网站| 色偷偷成人一区二区三区91| 国产精品亚洲αv天堂无码| 免费成人直播| 欧美午夜电影一区| 亚洲xxx在线观看| 国产精品日韩精品在线播放| 日韩一区二区三区在线观看| 色综合久久久无码中文字幕波多| 高潮久久久久久久久久久久久久| 亚洲第一黄色网| 免费在线观看成年人视频| 国产成人精品三级高清久久91| 国产一区二区三区三区在线观看| www.4hu95.com四虎| 日韩不卡一区| 久久6精品影院| 色网站在线播放| 久久久久久婷| 成人在线中文字幕| 日本免费一区视频| 国产欧美精品区一区二区三区| 天天人人精品| 五月花成人网| 狠狠色噜噜狠狠狠狠97| 在线免费av播放| 免费观看在线一区二区三区| 亚洲精品第一国产综合精品| 精品人妻一区二区三区蜜桃视频| 国产一区二区亚洲| 日韩有码在线观看| 日韩人妻无码一区二区三区99| 亚洲自拍另类| 成人夜晚看av| 韩国av免费在线观看| 91小视频在线| 日日噜噜噜夜夜爽爽| 91福利在线尤物| 欧美午夜一区二区三区免费大片| 中文字幕第10页| 中文字幕中文字幕精品| 欧美成人午夜激情| 国产剧情在线视频| 高清成人免费视频| 少妇特黄a一区二区三区| 国产丝袜视频在线播放| 91国偷自产一区二区开放时间 | 91九色porn在线资源| 欧美午夜精品理论片a级按摩| 国产又黄又嫩又滑又白| 国内精品视频在线观看| 久色乳综合思思在线视频| 中文字幕亚洲精品一区| 国产精品亚洲视频| 亚洲精品9999| 久久91导航| 精品成a人在线观看| 网站永久看片免费| 香蕉成人久久| 国产欧美丝袜| 怡红院在线播放| 欧美日韩一区三区| 成人免费av片| 在线欧美一区| 亚洲影视中文字幕| 国产福利在线看| 天天爽夜夜爽夜夜爽精品视频| 在线免费看污网站| 日韩成人a**站| 国产成人在线精品| 污污的视频网站在线观看| 亚洲日本电影在线| 人人干人人干人人| 一区二区三区四区在线看| 久久人人爽国产| 亚洲视频在线观看免费视频| 久久一二三国产| 中国丰满人妻videoshd| 国产精品qvod| 国外成人在线播放| 懂色av一区二区三区四区| 自拍视频在线观看一区二区| 一道本视频在线观看| 精品国产乱码久久久久久果冻传媒| 91精品国产色综合久久不卡98口| 超碰免费在线97| 亚洲精品日韩综合观看成人91| xxxx在线免费观看| 我不卡影院28| 91在线视频一区| 成年人在线视频免费观看| 在线看不卡av| 国产精品18在线| 国产精品亚洲综合一区在线观看| 咪咪色在线视频| 成人在线日韩| 欧美成人剧情片在线观看| 在线免费观看一级片| 中文字幕在线视频一区| 亚洲福利精品视频| 欧美gvvideo网站| 成人免费淫片视频软件| 亚洲淫性视频| 精品成人a区在线观看| 偷偷操不一样的久久| 91看片淫黄大片一级| 日本中文字幕片| 日本a级不卡| 国产精品网站入口| av片在线观看| 精品国产凹凸成av人导航| 日韩精品人妻中文字幕| 久久一区二区三区四区| 日本不卡一区二区在线观看| 亚洲成人99| y111111国产精品久久婷婷| 在线你懂的视频| 91在线小视频| 日韩有码免费视频| 亚洲精品小说| 欧美一区视久久| 日本精品一区二区三区在线观看视频| 国产91精品不卡视频| 午夜视频在线观看网站| 亚洲第一精品福利| 91丨porny丨在线中文 | 国产精品成人午夜| 风间由美一二三区av片| 国内精品伊人久久久久av影院 | 在线播放豆国产99亚洲| 男人的天堂久久| 91福利视频导航| 欧美成人一二区| 欧美一级高清免费播放| 91高清在线观看视频| 中文一区二区视频| 免费在线国产| 精品一区电影国产| 亚洲国产精品成人久久蜜臀| 欧美精品一级二级三级| 丰满人妻老熟妇伦人精品| 一区二区三区高清在线| 中文字幕在线观看二区| 91美女福利视频| 妖精视频一区二区| 成人一区二区三区| 91性高潮久久久久久久| 久久精品国产网站| 美女喷白浆视频| 久久资源在线| 男人靠女人免费视频网站| 亚洲精品孕妇| cao在线观看| 欧美日本久久| 日韩一级免费看| 欧美在线资源| 欧美国产视频一区| 欧美成人精品| 51xx午夜影福利| 欧美福利视频| 白白操在线视频| 午夜天堂精品久久久久| 激情六月天婷婷| 好看不卡的中文字幕| 日韩一二区视频| 午夜激情一区| 台湾无码一区二区| 黑丝一区二区三区| 美女扒开大腿让男人桶| 亚洲高清自拍| 黄色一级片播放| 久久精品91| 一区二区三区入口| 久久se这里有精品| 中文字幕第10页| 成人av电影在线播放| 黄色污在线观看| 久久看人人爽人人| 五月婷婷六月香| 亚洲欧美日韩人成在线播放| 国产大学生自拍| 亚洲国产精品一区二区尤物区| 中文字幕第28页| 一本久道中文字幕精品亚洲嫩| 一级黄色av片| 91麻豆精品91久久久久同性| 国产精品久久婷婷| 精品乱人伦一区二区三区| 人妻精品一区二区三区| 亚洲精品一区二区三区婷婷月| 国产成人天天5g影院在线观看| 日韩一区二区三区在线播放| 色呦呦在线视频| 欧美一级大片视频| 成人午夜sm精品久久久久久久| 91亚洲国产成人久久精品网站| 成功精品影院| 日韩欧美在线一区二区| 中文字幕一区二区三三| 日本免费不卡一区二区| 美女视频免费一区| 在线免费看黄色片| 国产欧美日韩精品一区| 久草视频免费在线| 91黄色在线观看| 亚洲第一天堂影院| 亚洲日本成人女熟在线观看| 香蕉视频免费在线播放| 久久久久中文字幕2018| 国产精品毛片久久久久久久久久99999999 | 国产高潮国产高潮久久久91| 亚州成人在线电影| 亚洲天堂999| 亚洲精品久久在线| 三区四区电影在线观看| 国内精品免费午夜毛片| 日本黄色一区| 精品国产一区二区三区久久久久久| 欧美另类69xxxxx| 男人插女人视频在线观看| 美女一区二区三区| 国产精品嫩草av| 亚洲视频你懂的| 黄色污污视频软件| 亚洲精品一区二区三区四区高清| 一区二区三区视频网站| 欧美在线欧美在线| 一区二区日韩| 亚洲一区二区三区免费看| 亚洲专区欧美专区| 麻豆tv在线观看| 中文字幕一区二区不卡| av一级在线观看| 日韩高清欧美高清| 欧美人与性动交α欧美精品济南到| 国产精品久久久久久av福利| 久久大胆人体视频| 青青青在线观看视频| 狠狠色丁香久久婷婷综| 中文字幕网站在线观看| 亚洲国产精品影院| 亚洲av无码国产综合专区| 日韩一区二区欧美| 成人在线免费av| 色姑娘综合网| 鲁大师成人一区二区三区| 中文字幕在线视频播放| 亚洲精选视频在线| 国产又粗又长又黄| 中文综合在线观看| 福利精品在线| 一区二区高清视频| 青娱乐精品在线视频| 国产成人无码av| 日本网站在线观看一区二区三区| 日本一区二区免费视频| 国产精品超碰97尤物18| 国产精品午夜一区二区| 日韩精品视频免费在线观看| 大黄网站在线观看| 国产精品国产精品国产专区不卡| 欧美成人69| 久久久久亚洲av成人网人人软件| 亚洲精品国产第一综合99久久| 国产免费av观看| 久久艹在线视频| 伊人精品综合| 激情小视频网站| 丁香婷婷综合激情五月色| 国产无遮无挡120秒| 精品对白一区国产伦| 九色91在线| 精品国产一区二区三区麻豆小说 | 蜜桃色一区二区三区| 亚洲一区二区三区四区五区中文| 亚洲第一视频在线| 91精品国产高清久久久久久| 台湾色综合娱乐中文网| 欧美精品成人网| 国产精品美女久久久久久久 | 黄色网址在线免费看| 国产成人免费在线视频| 日韩欧美中文字幕一区二区| 亚洲免费高清视频| 日本一区二区三区视频在线| 在线观看日本一区| 成人夜色视频网站在线观看| 欧美三级韩国三级日本三斤在线观看| 精品视频在线观看日韩| 成人国产一区| 高清无码一区二区在线观看吞精| 成人动漫精品一区二区| 国产91精品看黄网站在线观看| 亚洲天堂第二页| 久久综合给合| 一女被多男玩喷潮视频| 中文字幕欧美区| aaaa一级片| 人九九综合九九宗合| 欧美成人milf| 国产伦理在线观看| 在线观看免费一区| 影音先锋中文在线视频| 欧美另类一区| 国产另类ts人妖一区二区| 免费日韩一级片| 菠萝蜜影院一区二区免费| 成人av动漫| 免费涩涩18网站入口| 亚洲电影一区二区| 95在线视频| 国产日韩欧美精品| 美女在线观看视频一区二区| 日本午夜小视频| 日韩视频免费在线观看| 久久综合社区| 亚洲一二区在线观看| 欧美性猛交xxxx久久久| 深夜国产在线播放| 亚洲精品影院| 久久综合久久鬼色中文字| av av片在线看| 国产欧美一区二区三区久久| 午夜一级久久| 国产精品二区一区二区aⅴ|