« 在房地產版討論不動產 | Main | 無可救藥的咖啡蟲 »

March 22, 2006

Some thoughts about bug fixing

Dear all,

之前大家有討論到關於 programming training, 也有提到 bug fixing
剛好今天看到一個 bug, 就提出來說說我的一些想法, 對事不對人, 大家就純參考嘍 ~~

這個 bug 是這樣的:

void OnFileOpen() {
 CFileDialog dlgFile(...);
 if(dlgFile.DoModal() == IDOK) {
  csFileName = dlgFile.GetFileTitle();
  // 假設 user 選到 c:\path\file.mpg, 這裡會得到 file
 }
}

void OnFileAnalyze() {
 csFileName += ".spd"; // 意思是轉成 "file.spd"
 ...
}

這個地方有個潛在的問題, 如果 user 選取檔案之後, 不斷的重複按 Analyze
那麼每次設進去的檔名依序就會是:

"file.spd", "file.spd.spd", "file.spd.spd.spd" ....

字串的串接有潛在的危險, 特別是該變數會被反覆使用的時候, 至少應該要改成

 CString strTemp = csFileName;
 strTemp += ".spd";
 // 接下來都使用 strTemp, 這樣才會是安全的

我看到一種解法:

void OnFileOpen() {
 CFileDialog dlgFile(...);
 if(dlgFile.DoModal() == IDOK) {
  csFileName = dlgFile.GetFileName();
  // 如果是 c:\path\file.mpg, 這裡會得到 file.mpg
 }
}

void OnFileAnalyze() {
 csFileName.Replace(L".mpg",L".spd"); // 這樣 file.mpg 就會變成 file.spd
 csFileName.Replace(L".plt",L".spd"); // 如果是 file.plt 也會變成 file.spd
 ...
}

這個 bug 看起來是解掉了, 但是我覺得還不夠. 解 bug, Jet 一直很強調兩件事

1. 找出 root cause
2. 避免/防止 bug 再次出現

這兩點的目地都是為了, 找出正確的做法, 對症下藥, 使錯誤不再發生

這個解法會有什麼問題呢? 第一, 如果 QA 改天拉了一個 file.wmv 進來測試
那麼保證 QA 又會 key bug 進來, 因為沒有把 ".wmv" 換成 ".spd"

"那我說我只支援 mpeg 檔案, 拉 wmv 進來是不對的" 這樣行不行?

還是不行, 如果 QA 拉了一個檔案 "game1.mpeg", 照樣掛點, QA 又可以 key bug 了

那我加上 csFileName.Replace(L".mpeg",L".spd") 這樣不就好了嗎?

還是不行, 如果 QA 拉了一個檔案 "game2.taiwan.mpeg-1.format.mpg", 還是錯, QA 又有業績了

因為無法用窮舉法考慮所有狀況, 解了一隻 bug, 反而產生更多潛在的 bug ....

正確的解法應該是找出副檔名在的位置, 然後變更副檔名:

 _TCHAR drive[16];
 _TCHAR dir[256];
 _TCHAR fname[256];
 _TCHAR ext[16];
 _tsplitpath(_path, drive, dir, fname, ext);
 _TCHAR new_fname[256];
 _stprintf(new_fname, L"%s%s%s.%s", drive, dir, fname, "spd");

如此一來才算是徹底解決問題, 以後也不會再有類似的 bug 發生
不然也許下一個 project 會沿用這個 testbed, 而且可以支援 wmv
然後同樣的 bug 就又被 QA key 一次, 就很浪費時間了

也許我們無法做到零錯誤, 但至少解 bug 的時候, 盡量要做到一勞永逸


Best regards,
Chris Huang (RDCT)

Posted by chenhsiu at March 22, 2006 10:25 PM

Comments