欢迎来到天天文库
浏览记录
ID:34640936
大小:52.09 KB
页数:15页
时间:2019-03-08
《如何减少编程中的错误》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、如何减少编码过程中的错误。第一部分摘要我查看了广为熟知的即时聊天工具MirandaIM的源代码。该项目的规模非常大,将各种插件全部考虑在内,大约包括950,000个C和C++代码行。与其它任何开发时间较长的大型项目相同,它存在很多错误和错字。简介以下是整篇文章的缩简版,若想阅读全部内容,请点击此处。通过检查不同应用中存在的缺陷,我总结出一些规律。接下来,我会列举一些在MirandaIM中找到的缺陷示例,并尝试提出相关建议,帮助您避免大量可能在编码阶段发生的错误和错字。我使用了PVS-Studio4.14分析器来检查
2、MirandaIM程序。MirandaIM项目的代码质量非常高,这一点有它的受欢迎程度为证。我自己也在使用这款聊天工具,对它的质量十分满意。项目采用支持3级警告(/W3)的VisualStudio构建而成,不过注释的数量占去了整个项目资源的20%。1.避免使用memset、memcpy、ZeroMemory和其它类似函数首先,我想与大家分享一些使用低级函数如memset、memcpy和ZeroMemory等处理内存时可能出现的错误。我建议您想尽一切方法避免使用这些函数。当然,您也无需完全以此为准,将所有这些函数全部
3、使用循环来替代。不过,我看到过许多因使用这些函数所犯的错误,强烈建议您慎之又慎,只在确实有必要时才使用它们。我认为,只有以下两种情况必须使用这些函数:1)处理大型阵列时,即当您能够从优化的函数算法中获得优于简单循环的、切实可见的惠益时。2)处理大量小型阵列时,此处必须采用低级函数的原因也与性能提升有关。但是,在所有其它情形中,您最好尽量避免使用上述低级函数。例如,我认为,在类似Miranda这样的程序中,根本没有必要使用这些函数,因为Miranda不包括任何资源密集型算法和大型阵列。事实上,使用memset/mem
4、cpy等函数的唯一原因是编写短代码的方便性。然而,这种简易性具有很大的欺骗性,虽然编写代码时能够节省几秒钟的时间,但您可能需要花费几周的时间来查找由此造成的难以察觉的内存损坏错误。下面,让我们共同分析一下来自MirandaIM项目的几个代码示例。V512Acallofthe'memcpy'functionwillleadtoabufferoverfloworunderflow.tabsrmmutils.cpp1080-collapsesourceviewplaincopytoclipboardprint?1.typ
5、edef struct _textrangew 2.{ 3. CHARRANGE chrg; 4. LPWSTR lpstrText; 5.} TEXTRANGEW; 6. 7.const wchar_t* Utils::extractURLFromRichEdit(...) 8.{ 9. ... 10. ::CopyMemory(tr.lpstrText, L"mailto:", 7); 11. ... 12.} typedefstruct_textrangew{CHARRANG
6、Echrg;LPWSTRlpstrText;}TEXTRANGEW;constwchar_t*Utils::extractURLFromRichEdit(...){...::CopyMemory(tr.lpstrText,L"mailto:",7);...}这里只拷贝了整个字符串的一部分。错误非常简单,但切实存在。最有可能的情况是,之前存在一个包括“char”的字符串。后来程序员转为使用Unicode字符串,但却忘记了更改常数。如果您使用专门的函数来拷贝字符串,这种错误绝对不会发生。想象一下,如果该代码示例采用以下
7、方式编写:-collapsesourceviewplaincopytoclipboardprint?1.strncpy(tr.lpstrText, "mailto:", 7); strncpy(tr.lpstrText,"mailto:",7);那么程序员在转至Unicode字符串时便不需要更改数字7:-collapsesourceviewplaincopytoclipboardprint?1.wcsncpy(tr.lpstrText, L"mailto:", 7); 我并不是说这个代码就是完美的,只是它比使用
8、CopyMemory要好得多。下面请看另一个示例。V568It'soddthattheargumentofsizeof()operatoristhe'&ImgIndex'expression.clist_modernmodern_extraimage.cpp302-collapsesourceviewplaincopytoclipboardprint?1.v
此文档下载收益归作者所有