是人就會犯錯誤,是程式員就經常有BUG。
如果是C++程式員,唉,BUG就更多了。
有些BUG是高層次的(譬如演算法有誤)……但也有些BUG,只不過是一時胡塗,或者忙中出錯。
自從公司新來一位漂亮的女程式員(身材高挑,皮膚白皙),並且正好坐在我邊上……我每100行代碼的低級BUG量,急劇上升。
我決定用上Code::Blocks最近新帶的外掛程式工具:CppCheck。這是一款靜態檢查C++程式碼的工具。和C::B一樣是一款開源的軟體。
在SourceForge的首頁是: sourceforge.net/apps/mediawiki/cppcheck/index.php。
Cppcheck is an analysis tool for C/C++ code. Unlike C/C++ compilers and many other analysis tools, we don't detect syntax errors. Cppcheck only detects the types of bugs that the compilers normally fail to detect. The goal is no false positives.
CppCheck其實是一個獨立的工具,完全脫離任何IDE可以運行,早先我就是獨立使用它,但自打C::B把它給整合了,感覺使用起來更是方便了不少。
新版的外掛程式菜單中,可以找到CppCheck外掛程式,不過事前你可能需要單獨下載,安裝好CppCheck。:
sourceforge.net/projects/cppcheck/
為了示範,直接上手。搞一些低級錯誤,讓CppCheck檢查一下:
Code:
- #include <iostream>
- #include <fstream>
-
- using namespace std;
-
- int main()
- {
- #define MAX_INT_ITEM_COUNT 100
-
- int* p = new int[MAX_INT_ITEM_COUNT]; //分配了記憶體
-
- for (int i=0; i<MAX_INT_ITEM_COUNT; ++i)
- {
- p[i] = MAX_INT_ITEM_COUNT-i;
- }
-
- return 0; //沒釋放 p 就byebye了
- }
運行外掛程式,Code::Blocks 訊息列將顯示檢查結果:
說的是: 在main.cpp 的第17行,存在“記憶體流失的可能,相關對象是:p。”
呵呵,繼續改一下代碼:
Code:
- //... 前面代碼略
- int* p = new int[MAX_INT_ITEM_COUNT]; //分配了記憶體
-
- for (int i=0; i<MAX_INT_ITEM_COUNT; ++i)
- {
- p[i] = MAX_INT_ITEM_COUNT-i;
- }
-
- delete p; //正確寫法應是:delete[] p;
-
- return 0;
- //...
不需編譯,再從C::B菜單裡運行一下CppCheck外掛程式……這回是:
main.cpp|17|mismatchAllocDealloc : error : Mismatching allocation and deallocation: p|
意思是:在main.cpp檔案裡,第17行(上程式碼片段中的09行),有個“不匹配的記憶體配置與釋放”的錯誤,對象仍然是:p。(new[] 出來的東西,要用delete[]釋放,你非要說用delete也可以,那是因為你在用一個超級有問題的編譯器....)
注意事項:
A) 顯然,它不能檢查一切。
B)但有意思的,它經常能查出你自己都想不到問題。(偶爾讓你一身冷汗,連續120分鐘不敢再邊寫代碼邊斜眼看邊上的美女)
C)當然啦,有的它檢查出來了,但倒也不一定就是天條,畢竟C++程式是自由的,C++程式員個個都會搞些暗爽的代碼寫法。
結合 Code::Blocks的一些問題
很大的工程,或者工程有超大的檔案(往往是工具產生的那種),它檢查起來是超慢的,這時C::B會先是死等,慢慢的,就會變成等死。
想瞭解有哪些人在用c::b,請參看 :
http://student.csdn.net/space.php?uid=112600&do=thread&id=10087
-------------------------------------------------------------------------------
如果您想與我交流,請點擊如下連結成為我的好友:
http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c