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

欧美国产精品| 国产视频网站一区二区三区| 国产欧美一区二区精品性| 国产美女主播一区| 日本三级理论片| 成人在线免费视频观看| 日韩欧美一级在线播放| 777久久久精品一区二区三区| 丁香在线视频| 成人免费看视频| 国产精品亚洲美女av网站| 久久国产在线视频| 久久视频精品| 亚洲精品自产拍| 制服下的诱惑暮生| 日韩精品三区| 亚洲成av人片www| 亚洲制服中文| 日本人妖在线| 成人激情视频网站| 91欧美日韩一区| 波多野结衣电车| 亚洲精品看片| 久久97精品久久久久久久不卡| 亚洲综合网在线观看| 999精品视频在这里| 欧美精品国产精品| 杨幂毛片午夜性生毛片| 国产乱码午夜在线视频| 亚洲精品国产精华液| 午夜精品视频在线观看一区二区| 日韩性xxxx| 国产一区二区精品久久91| 国产精品99导航| 日本中文在线播放| 国产一区二区三区四区老人| 搡老女人一区二区三区视频tv| 无码人妻精品一区二区三区温州 | 香港欧美日韩三级黄色一级电影网站| 亚洲国产另类久久精品| 善良的小姨在线| 99久久久国产| 5月丁香婷婷综合| 欧美在线aaa| 久久91导航| 日本高清成人免费播放| 黄在线观看网站| 亚洲人成在线网站| 精品高清一区二区三区| 日韩精品一区在线视频| 欧美性video| 一区二区国产视频| 亚洲中文字幕无码一区二区三区| 成人看av片| 一区二区三区丝袜| 日本阿v视频在线观看| 欧美卡一卡二| 性久久久久久久久久久久| 免费不卡av在线| 国产福利电影在线播放| 精品动漫一区二区| 国产欧美在线一区| 刘亦菲一区二区三区免费看| 色婷婷亚洲婷婷| 午夜精品在线免费观看| 欧美性aaa| 欧美一区二区大片| 在线xxxxx| 亚州av一区| 在线视频中文亚洲| 波兰性xxxxx极品hd| 中文在线日韩| 高清视频欧美一级| 黄色片视频免费| 麻豆国产精品视频| 动漫3d精品一区二区三区| 性一交一乱一透一a级| www.亚洲国产| 日韩精品久久一区| 大片免费在线观看| 天天av天天翘天天综合网| 欧美精品第三页| 免费成人毛片| 亚洲成人黄色网| 亚洲欧洲久久久| 亚洲精品888| 5252色成人免费视频| 中文字幕资源网| 国产99久久久国产精品免费看| 精品亚洲欧美日韩| 麻豆传媒视频在线观看| 性欧美疯狂xxxxbbbb| 精品亚洲一区二区三区四区| 深夜福利一区| 亚洲一区www| 国产真实的和子乱拍在线观看| 亚洲一区二区三区高清不卡| 国产精品男人的天堂| 成人av无码一区二区三区| 99精品欧美一区二区三区小说 | 综合久久十次| 日本欧美在线视频| 精品久久国产视频| 国产欧美日韩视频在线观看| 日韩a级黄色片| 日韩三区在线| 亚洲精品狠狠操| 少妇人妻丰满做爰xxx| 亚欧美中日韩视频| 亚洲最大成人免费视频| 国产免费a∨片在线观看不卡| 一区二区三区精密机械公司| 性猛交ⅹ×××乱大交| 香蕉久久夜色精品国产更新时间| 欧美成年人视频网站欧美| 波多野结衣日韩| 99精品黄色片免费大全| 日韩欧美视频免费在线观看| 四虎永久精品在线| 亚洲人成电影在线播放| 国产成人精品a视频一区| 国内国产精品久久| 五月婷婷一区| 欧洲av一区二区| 亚洲第一av网站| 三级全黄做爰视频| 奇米影视一区二区三区小说| 久久久久久草| 成人一级福利| 亚洲变态欧美另类捆绑| 日韩成人毛片视频| 精品亚洲aⅴ乱码一区二区三区| 欧美日韩免费精品| 午夜伦理福利在线| 亚洲国产天堂久久综合网| 九九视频免费看| 国产一区二区三区日韩| 在线观看成人av电影| 国产69精品久久| 在线观看不卡av| 久久久999久久久| 久久九九影视网| 情侣黄网站免费看| 神马电影久久| 国产成人aa精品一区在线播放 | 久久精品国产2020观看福利| 最近中文字幕免费在线观看| 久久精品亚洲乱码伦伦中文 | 福利一区二区三区四区| 国产1区2区3区精品美女| 国产又粗又长又爽视频| 欧美三级一区| 欧美丰满少妇xxxxx做受| 成人av一区二区三区在线观看| 自拍视频在线观看一区二区| 欧洲在线免费视频| 欧美aa国产视频| 999精品视频一区二区三区| 青草在线视频| 日韩精品视频免费| 亚洲成熟少妇视频在线观看| 日本一区二区三区在线观看| 亚洲黄色小视频在线观看| 婷婷亚洲五月色综合| 999国产在线| 国产精品25p| 尤物九九久久国产精品的分类 | 天堂av在线网| 亚洲色图13p| 伊人22222| 一区二区三区精品在线| 亚洲精品中文字幕在线播放| 久热综合在线亚洲精品| 亚洲欧洲精品一区二区| 国产在线视频欧美一区| 久久人人爽人人爽人人片av高请| 天堂av电影在线观看| 欧美亚洲国产一区二区三区| 蜜桃视频最新网址| av在线一区二区三区| 欧美少妇性生活视频| 久久久久午夜电影| 中文精品电影| 日韩美女免费视频| 免费网站免费进入在线| 日韩精品一区二区三区蜜臀| 久久久精品福利| 国产精品久久久久一区二区三区共| 久久久久久久高清| 亚洲精品综合| 宅男噜噜99国产精品观看免费| 亚洲高清在线一区| 青青久久av北条麻妃黑人 | 自拍偷拍亚洲一区| 丰满人妻av一区二区三区| 色综合婷婷久久| 国产高潮国产高潮久久久91| 久久综合视频网| 亚洲妇女无套内射精| 天堂av在线一区| 久久亚洲a v| 成人激情免费视频| 国产精品我不卡| 日韩免费大片| 日韩免费观看高清| 丝袜美腿av在线| 色噜噜狠狠色综合网图区| 亚洲aaaaaaa| 日韩一区二区三区视频| 国产在线一级片| 精品免费在线视频| 久久久久无码国产精品不卡| 中文一区二区在线观看| 人妻少妇精品视频一区二区三区| 国产在线一区二区| 国语对白做受xxxxx在线中国| 欧美va亚洲va日韩∨a综合色| 日韩免费毛片| 日本欧美高清| 国产伦精品一区二区三区视频孕妇 | 不要播放器的av网站| 亚洲激情不卡| 日本天堂免费a| 欧美国产美女| 色一情一区二区三区四区| 国内精品麻豆美女在线播放视频| 成人免费在线网址| 欧美一级做a| 国产精品一区二区久久久久| 成人免费看黄| 欧美在线影院在线视频| 国产三级电影在线播放| 欧美疯狂xxxx大交乱88av| 国产三区视频在线观看| 日韩中文在线视频| 福利在线观看| 中文字幕亚洲欧美一区二区三区 | 欧美一区第一页| av老司机免费在线| 韩日精品中文字幕| а√天堂资源官网在线资源 | 欧美大胆性生话| 欧洲成人免费视频| 欧美片第1页| 日本欧美一二三区| japanese23hdxxxx日韩| 国产精品999999| 久久av影院| 成人欧美一区二区三区黑人| 电影中文字幕一区二区| 亚洲精品免费网站| 亚洲1区在线| 国产综合精品一区二区三区| 卡通动漫国产精品| 欧美日韩在线观看一区| 国产不卡av一区二区| 日韩精品一区二区三区外面| 成人在线亚洲| 中文字幕第一页亚洲| 国产一区二区中文| 秋霞无码一区二区| 日韩一区精品视频| www.成年人| 国产91精品久久久久久久网曝门| 亚洲av人人澡人人爽人人夜夜| www.av精品| 一道本在线观看| 中文字幕在线不卡国产视频| 日韩女优一区二区| 福利视频导航一区| 中文字幕一区二区三区免费看| 欧美高清性hdvideosex| 丰满人妻妇伦又伦精品国产| 亚洲精品日韩在线| 91网在线播放| 欧美黄色三级网站| 另类专区亚洲| 91在线看www| 日韩av三区| 自拍偷拍亚洲色图欧美| 影音先锋亚洲一区| 中文字幕第36页| 国产成人8x视频一区二区| 青青草福利视频| 亚洲图片激情小说| 欧美亚韩一区二区三区| 欧美日韩激情一区二区三区| 好吊视频一区二区三区| 亚洲一区二区国产| 午夜成年人在线免费视频| 欧洲美女免费图片一区| gogo大尺度成人免费视频| 国产亚洲二区| 婷婷六月综合| 日本一本二本在线观看| 国产精品资源在线观看| 男女黄床上色视频| 亚洲一区二区影院| 中文无码精品一区二区三区| 亚洲成人久久一区| 五月婷婷在线视频| 91国产精品91| 精品一区二区三区亚洲| 麻豆精品视频| 伊人精品在线| 亚洲精品成人在线播放| 国产午夜亚洲精品羞羞网站| 久操视频免费在线观看| 欧美日韩午夜在线| 青春有你2免费观看完整版在线播放高清| 久久夜精品va视频免费观看| 国产免费不卡| 国产一级二级三级精品| 综合国产精品| 久国产精品视频| 久久精品人人做| 自拍偷拍欧美亚洲| 日韩网站在线看片你懂的| 在线免费看av| 国产精品欧美激情在线播放| 欧美亚洲大陆| 可以看毛片的网址| 国产成人无遮挡在线视频| 四虎国产成人精品免费一女五男| 福利二区91精品bt7086| 手机看片福利永久| 久久久久中文字幕2018| 伊人精品综合| 黄色一级片av| 国产成人小视频| 国产高潮国产高潮久久久91| 69av一区二区三区| 午夜视频成人| 国产美女久久精品| 四虎8848精品成人免费网站| 男女啪啪网站视频| 国产蜜臀97一区二区三区| 波多野结衣绝顶大高潮| 国产亚洲欧美另类中文| 高清电影一区| 色999日韩自偷自拍美女| 丝袜国产日韩另类美女| 熟女俱乐部一区二区| 欧美日韩一区免费| 欧洲天堂在线观看| 国产国产精品人在线视| 你懂的视频欧美| 国产xxxxx视频| 日本一区二区成人| ,一级淫片a看免费| 久久色在线播放| 精品视频在线观看网站| 欧美a级免费视频| 成人激情av网| 久久99精品波多结衣一区| 亚洲品质视频自拍网| 国产成人免费| 天天成人综合网| 国产白丝网站精品污在线入口| 精品无码免费视频| 亚洲第一福利网站| 欧美大胆成人| 一区二区三区四区国产| 国产精品1024| 国产尤物在线视频| 在线视频欧美日韩精品| 国产在线不卡一区二区三区| 久久精品无码中文字幕| 91在线porny国产在线看| 久久久蜜桃一区二区| 日韩在线视频播放| 综合伊人久久| www黄色av| 亚洲三级电影网站| 少妇精品视频一区二区| 国产成人啪精品视频免费网| 99精品美女| 超碰caoprom| 91国偷自产一区二区三区成为亚洲经典 | 男女啪啪免费视频网站| 久久精品视频免费观看| 88av在线视频| 久久久久久久影院| 国产成人三级| 欧美一级片在线免费观看| 岛国精品视频在线播放| 欧美18一19xxx性| 韩国一区二区三区美女美女秀 | 牛牛国产精品| 国产精品无码一区二区三区| 56国语精品自产拍在线观看| 3344国产永久在线观看视频| 色之综合天天综合色天天棕色| 国产成人精品一区二区三区四区| 性色av免费观看| 美乳少妇欧美精品| 不卡在线一区| 小毛片在线观看| 6080国产精品一区二区| 欧美成人ⅴideosxxxxx|