如何减少编程中的错误

如何减少编程中的错误

ID:34640936

大小:52.09 KB

页数:15页

时间:2019-03-08

如何减少编程中的错误_第1页
如何减少编程中的错误_第2页
如何减少编程中的错误_第3页
如何减少编程中的错误_第4页
如何减少编程中的错误_第5页
资源描述:

《如何减少编程中的错误》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

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

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。