加载中…
个人资料
蒋晟VC
蒋晟VC 新浪个人认证
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,019
  • 关注人气:4
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
公告

评论
加载中…
留言
加载中…
友情链接

其他BLOG

BLOG聚合

Google广告
暂无内容
访客
加载中…
好友
加载中…
博文
标签:

杂谈

阅读  ┆ 转载 ┆ 收藏 
(2009-06-10 03:07)
标签:

杂谈

  • The Java(TM) cannot be downloaded to your machine. You are located in an embargoed country. 2009-05-28 06:02:10

  • No built-in intellisense for C++/CLI in Visual Studio 2010? Great opportunity for Visual Studio extension developers... 2009-05-29 01:57:21

  • Not sure what is going on at Microsoft Connect: An item I submitted to Microsoft connect changed 3 times at 1:34.. http://bit.ly/XxvKF 2009-05-30 10:41:32

  • Vulnerability in Microsoft DirectShow Could Allow Remote Code Execution
阅读  ┆ 转载 ┆ 收藏 
(2009-05-28 03:11)
标签:

杂谈

  • Could not generate BizTalk files. Parameter type Guid does not have a namespace. A namespace is required for generating schema for this type 2009-05-20 11:32:05

  • When BizTalk reports a field is repeating more than allowed number of times, it is probably repeating less than required number of times 2009-05-21 07:13:12

  • Microsoft Vine's log on UI looks like Windows Live Messenger...why not publish as a messenger addon instead? 2009-05-22 00:44:48

  • http://sourceforge.net/projects/mirth/ i
阅读  ┆ 转载 ┆ 收藏 

尽管断言可以提示可能的问题,但是这意味着程序员需要预料代码中可能存在的问题——而程序员不可能预料到全部问题。最常用的办法还是用调试器来单步调试代码。这个优势是测试人员不具有的,他们只能使用各种各样的输入数据,然后检验输出。

但是单步测试所有的代码?

如果程序员对自己代码很自信,那么他们可以不对编写的代码进行单步测试——但是有多少人能保证自己的代码没有BUG?更不用说单步测试代码的时间和编写代码的时间相比只是九牛一毛了。

我知道习惯良好的程序员会编写异常处理代码。但是,所谓异常就意味着平常这些代码不会被执行到,所以在测试这部分代码时,可以手动编写抛出异常的代码,或者在调试器中修改保存函数返回值的变量的值,以及手动设置当前语句(但是注意这可能使得栈的状态和代码不匹配)。

应该设置断点的位置

  • 构造函数的结尾。每一个成员变量在运行到这里的时候都应该被初始化完毕,如果你在Visual C++中调试时看到一个成员变量具有0xcccccccc这样的值,那么你就忘记初始化这个成员变量了。
  • 函数的开头。如果你的函数工作不正常,检查函数的参数,看看是否符合你的函数的要
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
分类: 编程技巧

断言并不能抓住所有BUG——它们都是人写出来的,而是人就会犯错误。一些常见的错误包括:

  • 使用状态不确定的资源
  • 在释放资源之后继续访问资源
  • 在资源重新定位之后继续引用旧的资源
  • 申请资源之后丢失对资源的引用
  • 访问时未注意是否越界
  • 忽略错误信息

这些并不是杞人忧天的问题——实际上,这些问题是日常开发中最常见的问题。这些问题的特点是,它们并不是时常造成程序行为的异常,并且症状不可重复。以内存为例,释放内存之后编译器和操作系统通常不会自动去擦除内存中的内容,所以继续访问内存不太可能造成程序行为的异常——直到内存被重新分配出去,而另一块代码开始重写这块数据。申请资源之后丢失对资源的引用可能只是造成长时间运行之后系统资源不足而已。另外,这些问题都是算法的问题,而编译器并不会替你校验你的算法,你自己也不太可能会怀疑你自己的算法。

 

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2006-02-05 11:23)
分类: 编程技巧

使用编译器来捕获BUG的主意很好,Visual Studio 2005甚至会报告定义的变量不符合命名规范(Warning 1 CA1709 : Microsoft.Naming : Correct the casing of type name 'welcome'.);但是我敢打赌你检查BUG列表的时候,你会发现只有一小部分BUG会被编译器抓到。很多BUG在程序运行过程中很少会出现,例如内存分配失败的问题

char* strBuffer=new char [length];
MyZeroMemory(strBuffer,length);

这段代码在绝大多数情况下会成功,但是在虚拟内存不足的时候,Windows会报告“您的系统虚拟内存太低,WINDOWS会增加虚拟内存页面文件的大小。在这个过程中,一些应用程序的内存请求会被拒绝”然后开始增加虚拟内存,在这个过程中,new这样的内存分配可能会因为内存不足而失败,而MyZeroMemory则可能会造成访问越界。如果你足够幸运,你会在产品发布之前发现这个BUG,否则,你的用户会代替你发现这个BUG。要是用户刚好没有备份的习惯,丢失了几十分钟甚至是几小时的工作进度,用户会很生气,后果很严重。

 

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
分类: IT

CSDN 讨论总结系列:

阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2006-02-05 10:39)
分类: 编程技巧
智能化的编译器开始将语法正确的语句列为警告:
while(size-->0);//注意这里有个分号
    *pTo++=*pFrom++;
编译器会报告空循环问题。
但是对于以0结尾的字符串复制
while(*pTo++=*pFrom++);
,这样的警告是多余的。
更加常见的警告是在条件判断语句中
if(ch='\0')
    EndOfString();
为了绕过这个警告,需要添加额外的运算或者语句,或者更正错误的赋值。
while((*pTo++=*pFrom++)!='\0'){}
if(ch=='\0')
一些程序员甚至将比较语句修改成
if('\0'==ch)
这样作的原因显而易见:为了减少潜在的BUG。如果你的编译器没有这样的警告,那么你可以使用一些工具来检查那些语法正确但是有潜在BUG的代码。LintProject http://www.codeproject.com/tools/lintproject.asp)就是其中一个。但是,良好的编程习惯还是减少BUG出现的最好的方法。

在觉得警告消息太烦人的时候,不妨想想编译器的开发人员为什么要编写这么多警告消息,而不是仅仅寻求关闭警告的方法。

P.S. Visual C++的默认
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2006-02-05 10:39)
分类: 编程技巧
Donald E. Knuth(高德纳)在TeX: The Program的前言中说:
'我相信,在1985年11月27日,TeX代码里面的最后一个BUG已经被发现和解决了。但是,如果代码中仍旧有BUG,我很高兴付给任何第一个发现BUG的人20.48美元(这是前一个金额的两倍,而且我计划在一年内把它翻倍。你看,我很自信!)' 

想知道后来发生了什么吗?

http://truetex.com/knuthchk.htm可以看到他写出去的支票的金额是从2.56美元开始翻倍的。微基百科中关于这种支票的文章(http://en.wikipedia.org/wiki/Knuth_reward_check)说,截至2001年10月为止,他写出去了超过两千张这样的支票,但是他的BUG支票是如此有名,以至于很多人把他的支票收藏起来而不是拿出去兑现。

有多少程序员在发布产品的时候可以这样自信地声明产品没有问题?
遗憾的是,现在的程序员经常把发现BUG的责任推给测试人员——“不用担心,测试人员会发现所有BUG的,这是他们的工作”。

实际上,测试人员并没有开发人员的条件,他们不可能进行源代码级别的调试,很大
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
(2006-02-05 10:31)
分类: 编程技巧
太多人把不要使用goto奉为圣旨,从来不想去打破。他们会争论,goto会造成难以维护的难读的代码,以及使编译器无法进行优化。这两点在很大程度上是真的,但是也有使用goto可以增加程序可读性和效率时候。在这种情况下,遵循“不使用goto语句”规范会产生更糟糕的代码。

一些人喜欢在成员函数后面加const,但是另外一些人没有养成这个习惯。一个直接的结果就是,一些看起来对对象完全没有影响的函数不能在const函数里面使用。这时候应该怎么办?看看Paul DiLascia建议的,把this指针强行转化为一个非const指针(http://www.microsoft.com/msj/archive/S126E.aspx)。如果函数实际上会对对象成员造成影响(例如CToolBar::GetItemRect),这也会带来危险。

为了和ANSI标准之前编写的代码兼容,ANSI C中的memchr函数的声明为
void *memchr(
   const void *buf,
   int c,
   size_t count
);

这里c是一个字符。很明显,标准为了兼容性放弃了明确性和更强的类型检查。如果放弃兼容性,
阅读  ┆ 评论  ┆ 转载 ┆ 收藏 
  

新浪BLOG意见反馈留言板 电话:4006900000 提示音后按1键(按当地市话标准计费) 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

新浪公司 版权所有