通過C 開發專案的過程中,你遇到過哪些令你印象深刻的BUG?

時間 2021-06-02 11:35:19

1樓:

說乙個比較奇怪的。

一般選取重試間隔的邏輯喜歡用指數退避,但是有一次我覺得指數退避無論怎麼取底數(整數)都不能取到乙個平緩的曲線,重試次數多了間隔就會變得特別大,於是想了想不如做個斐波那契退避吧,最後為了避免給執行時產生開銷,直接用模板實現放到編譯時計算,實現就是最簡單的遞迴實現,最後通過這樣的方法呼叫:

fib::interval::val;

比如 N 如果是 5 的話,fib::interval<5>::val 就是 5。

然而手賤了一下有個地方不知道怎麼回事把 6 打成了 60,編譯報錯告訴我超出遞迴層數限制。我沒太在意直接把展開的層數加到 104857600 然後重新編譯,於是我記憶體直接瞬間被佔滿,滑鼠游標卡到沒法動,過了半分鐘系統直接藍屏。

2樓:粉蒸排骨

改BUG不過都是見招拆招、兵來將擋的事情,好像印象都不深刻,最多再次遇到同樣的坑會繞道。

真正讓程式設計師印象深刻的,是產品經理 or 老闆骨骼清奇、腦洞大開的需求吧?

3樓:星空妄想者

10年前撞在了靜態物件構造順序的bug上。乙個靜態物件的建構函式裡呼叫了另外乙個靜態物件的成員函式。那個物件居然沒有構造,然後就中招了。

4樓:向琳

呼叫第三方商業計算庫,exe相同,在10代以上Inter的CPU 出問題,以下的沒問題,AMD的也沒問題,但即使沒問題的結果中,每台機器跑的結果都有細微差別。感覺可能是第三方庫精度誤差導致的問題

5樓:d41d8c

雖然不是我自己的專案……

#include

#include

void f(std::unique_ptr p) ;

}int main()

在GCC 9.1上產生double delete的錯誤,而在之前的版本裡執行正常。

在GCC Bugzilla Main Page 搜尋「conditional throw」,發現已經有人向GCC提了bug report: 90393 - [9/10 Regression] ICE in return statement with a conditional operator, one of the second and third arguments is throw, and the other is a const variable of a class with a nontrivial copy constructor.

顯然,其他人也遇到過這個bug。

那麼這個bug是怎麼導致的呢?

檢查彙編碼發現f內沒有呼叫unique_ptr的移動建構函式,在構造q時是直接複製二進位制表示。因為沒有呼叫移動建構函式,所以沒有把p置空。在p和q析構時delete了同乙個指標值,導致錯誤。

嘗試讓GCC顯示p ? std::move(p) : throw std::invalid_argument的型別,發現GCC認為這個表示式是prvalue[1]。

根據copy elision的規則,從prvalue構造物件不需要呼叫建構函式。

但是從std::move(p)(這是xvalue)到prvalue的轉換會呼叫建構函式([conv.lval])。

為什麼之前的版本都呼叫了移動建構函式,而GCC 9.1沒有呼叫呢?

注意到上面說的bug report 90393裡,Marek Polacek[2]提到「Started with r260272.」說明很可能是r260272這次修改導致了這個bug。

點開鏈結,發現r260272聲稱實現了CWG 1560。

過去,形如a ? b : throw的表示式都是prvalue,而CWG 1560改為不需要進行到prvalue的轉換,於是結果的value category與b的value category相同。

這就很糟糕了。

在GCC的原始碼中查詢,發現GCC對於表示式的value category的計算是在lvalue_kind這個函式中進行的。r260272並沒有修改這個函式。

試著修改lvalue_kind使GCC不再認為a ? b : throw的結果是prvalue,再改掉乙個由此引發的錯誤之後,重新編譯GCC並進行測試,發現果然解決了開頭所說的問題。

我把我的發現貼在https://

gcc.gnu.org/bugzilla/sh

ow_bug.cgi?id=90393

後乙個半月,GCC的維護者Jason Merrill修改了lvalue_kind的定義,修復了這個bug。

這個bug我在關於C++左值和右值區別有沒有什麼簡單明瞭的規則可以一眼辨別?提過。

倒不是說這個bug有多複雜(其實挺簡單的,適合作為GCC找bug的入門練習),不過這個bug讓我發現,就連GCC編譯器的作者都搞不定關於左值和右值的問題……

6樓:向陽

第乙個是學圖形學的時候。

透視投影有個近視平面位置zNear、遠視平面位置zFar。因為是跟著學,所以我就順手造了個數學庫玩(放心吧效能比glm略微好一點)。當時陰差陽錯的兩個寫反了,但是我沒發現——因為模型不複雜,看起來都很正常

等到後面開始寫旋轉矩陣的時候,順時針逆時針是錯的,然後又和四元數對不上。最後,打了個斷點,手算了旋轉矩陣。發現旋轉矩陣都挺正確的。。

直到我準備算透視投影,發現?

zNear和zFar寫反了…

後來有一次有意思的記憶體溢位,剛好溢位了4位元組,把類成員後面的乙個變數覆蓋了,然後還沒被探測到。結果在特定情況下那個類的功能就不對。後來是咋辦呢

是插了個int check變數在中間,才發現那地方溢位了。

還是學圖形學的時候,自己編譯的zlib,用zlib出毛病,uncompress會崩。後來才定位到錯誤是zlib庫的問題,取消掉包含彙編,編譯鏈結,完事(也就這樣有了人生中第一條issue(雖然是個回覆))

7樓:

調整程式計數器(Program Counter)的時候調整出錯,本來該跳轉到某個函式的函式位址開始執行,不小心跳轉到了某個函式的函式位址的下一行指令,也就是該函式的calling convention中的開闢棧幀空間的彙編指令(類似sub rsp,16)被跳過了。最後導致整個棧的資料都是亂的,而且很難排查 :)

8樓:

之前寫 OJ 評測核心

那時候太菜了,還不知道有 CMake 這種東西,還是手寫的 Makefile

估計還是太菜了,Makefile 寫的可能有·問題,只能探測出原始檔的改動,標頭檔案改動探測不出來。於是乎引用了修改標頭檔案的原始檔不能夠自動重新編譯

那次,我修改了乙個標頭檔案裡的類的布局,引用這個類的 a.cpp 修改了,b.cpp 沒改

然後懶,又沒 clean 後重新編譯,直接增量編譯了

執行核心開始評測,段錯誤,核心卒

那時候還不知道有 valgrind 這種定位段錯誤能定位到行的神器

直接 cat 系統的 log,裡頭有奔潰時候的呼叫棧資訊,沒有任何除錯資訊,只有 16 進製的位址

反彙編核心,手算偏移,找到了引發奔潰的那行

哦,這不是用了我修改的那個類剛剛加的乙個欄位嘛

clean 了重新編譯,果然沒問題了

你在學車的過程中遇到過那些趣事?

韹譯 練科三的時候,每個人練完一圈,教練就開回起點再接上下乙個人,教練開車為了趕時間並且年年跑這條路,所以都挺快的。那天我練完又是教練往回開的時候,有個地方要掉頭,從對面路上開過來一輛車,教練沒看見就直接掉頭了,差點就撞上了。那車司機減速,從窗裡探出來伸中指,就開始罵教練。從學車開始教練啥人都罵過,...

你在產後恢復過程中遇到過哪些問題?

1.產後便秘 通常新媽媽產後2 3天內會排便,如果超過3天,則可以判斷為產後便秘。解決辦法 從產後第二天就要養成定時排便的習慣,即使沒有便意,也要定時去廁所,逐漸形成排便反射 如果身體條件允許,可以多走動,促進腸道蠕動 如果還不能下床,可以多翻身,變換睡姿 經常做收縮盆底肌肉的運動,恢復肌肉力量 多...

網際網路產品專案推進過程中你都遇到過哪些矛盾 問題?

蔣勇翔 新人回答,拋磚引玉。在做產品過程中,資源永遠都不足,需求永遠都做不完。最大矛盾已然變成了無窮盡的需求跟有限的資源之間的矛盾。PM會從多個渠道 途徑獲取到新的需求,如何判斷需求的優先順序,是我作為乙個產品助理遇到的比較大的問題。有老大提出來的需求,有業務方提出來的需求,有自己發現的系統的bug...