最近在 trace 的程式碼當中讀到類似下列這樣的片段
TCHAR name[MAX_NAME];
...
::GetWindowText(hwnd, name, sizeof(name));
對我來說這是一個明顯到不行的錯誤,就算混雜在一大堆別人寫的程式碼中,被我認出來的機會也很高(這不就被我抓到了嗎?)。我大概可以想像這個程式過去不太用 UNICODE 編譯,因此這樣的錯誤有時會存在很長一段時間沒發現。由於這是個使用者眾多的軟體,所以我查了一下,這個錯誤在原軟體中好幾年前就已經被修正了,但是一些第三方提供的 plugin 至今仍然引用到早期版本的原始碼。
在讀到上面這段程式碼之後沒多久,我在同一個軟體的另一個組件當中又發現了另一段可疑的程式碼:
::SetWindowLongPtr(hWnd, GWL_WNDPROC, (LONG) wndProc);
這位作者使用了 SetWindowLongPtr 顯然是考慮到一些事情,但是接下來的寫法使得這項努力白費。我比較好奇的是作者既然細心地考慮到 64 位元的問題,為何在臨門一腳上疏忽了呢?我想有可能是他從其他的地方複製貼上程式碼,卻沒注意到從其他資料變成指標會發生問題。
再來是今天在騎貘吃釋迦看到一位初學者寫的:
while (n == 1.1)
可想而知,他對這段程式碼造成的結果感到非常地意外。這是一個非常入門的錯誤,記得早在我剛開始學寫程式沒多久(附帶一提,就是那種每行開頭要手工加行號的古典 BASIC),就已經知道這是不好的寫法。就我印象所及,這可能是我開始注意到的第一個小細節,但我不太記得有什麼書特別提到這樣的知識,好像寫多就學到了,等到理解計算機工作原理的時候就知道為什麼了。
經過多年的學習之後,我已經不太會犯某些錯誤,就算在精神不佳的時候也有機會靠著簡單的法則和來避開錯誤發生。但我還是常常會犯其他錯,有可能是因為我在這方面經驗還不足以學到如何辨識這些模式,又或者這些模式太過於複雜以至於沒有簡單的規則可以套用,或許這些錯誤在別人眼中也是非常明顯、非常不該犯的。
我記得很久以前在學習 Javascript 的時候非常隨性,好像沒有考慮很多事情。多年未接觸 js 之後有一次因為幫朋友代工又從新摸起,然後我發現 coding 速度變得非常慢,因為我考慮的事情變多了,但我對 js 其實沒有那麼熟悉,很多東西都必須要一一確認,以免犯了不該犯的錯誤。這也算是一種進步吧。
不熟悉 Windows API 的網友可以參考 MSDN 對 GetWindowText 的說明。雖然錯誤和 GetWindowText 本身沒有太大的關係
http://msdn.microsoft.com/en-us/library/ms633520%28v=vs.85%29.aspx
SetWindowLongPtr 的說明:
http://msdn.microsoft.com/en-us/library/ms644898%28v=vs.85%29.aspx
留言列表