为了使用BoundsChecker这个传说中的工具,不得不把VS2008的工程转到VC6.0去,结果好多编译和链接错误:
- VC6.0的MFC类库的版本不一样吧,一些比较新的方法VC6.0都不认识,想_itoa_s就必须改成itoa,命名空间stdext也不认识,直接注掉;
- stafx.h里面include了<afxsock.h>,在另一个地方又include了<winsock2.h>,导致超级多变量重定义,注掉<afxsock.h>就OK了,但是为啥VS2008就顺利编译链接了呢?。。。
- 一个很诡异的问题,BEGIN_MESSAGE_MAP。。里面的ON_BN_CLICKED(IDC_BTN_START, &CTPServerDlg::OnBnClickedBtnStart),这个消息响应函数之前应该是不加“&”的吧?为啥VS2008里面加上也能编译通过?这个我也没去研究。。
- 最后出现了链接错误,然后在“头文件”“源文件”中添加进去就OK了
最后出现了很多waring,不过可以运行了。。
Boundschecker确实很强大,比如未初始化的内存,内存泄露,资源xx的。。。不过后来发现,它有点过分了。。还是需要无视它检查的一些泄露,比如每次出现在onexit.c中的错误,网上说直接无视这个,我还无视了其他两个异常,因为实在找不到那两个跟我的代码有什么关系。。。。最后发现500客户端并发的时候会出现access violation的错误,调试一下发现是xtree文件里面的(好像这个调试跟boundsChecker没啥关系),OK,既然是xtree,那肯定是map或者list的错误了。检查发现有几个map的多线程同步始终存在这漏洞,一一加临界区,测试。。基本OK了。。最后好像boundsChecker也没派上啥大用,只不过让我增加了一些信心而已。。。其实vld这玩意也还行,还对编译器没有要求。。
希望我的Server不要再出问题了吧。。