4.1、该死的臭虫

By | 2016年1月31日

在上一篇文章中的程序,我们的程序没有按照我们所期望的方向运行,我们的程序输出了错误的结果。

像这样的程序错误,包括程序设计的缺陷,我们称其为BUG

bug在英文中是虫子的意思,那么这样一只虫子又怎么和计算机中的缺陷联系起来了呢?我们将在题外话中谈到这个故事。

而在今天的这一篇文章中我们将主要谈到编程中一些缺陷造成的原因,同时我们将看到那些由bug造成的一些损失

bug和程序员似乎天生就是一个“好兄弟”。如果你要追寻它的本质,那么bug其实就是程序员犯的错误(实际上因为非软件的因素产生的bug也是存在的)。

在这个世界上,不管是像Linus Torvalds(linux内核创始人)这样的“神人”,还是普通程序员,亦或是在编程道路上孜孜求索的你和我,只要动手写程序,bug都可能飞过来打招呼

设计和制造了世界上第一台存储程序式电子计算机(EDSAC)的著名计算机科学家Maurice Wilkes(莫里斯·威尔克斯)说过这样一句话

It was on one of my journeys between the EDSAC room and the punching equipment that the realization came over me with full force that a good part of the remainder of my life was going to be spent in finding errors in my own programs.

—Maurice V. Wilkes

将其翻译成中文,大致的意思就是:

我强烈的意识到我的余生中美好时光,都将花费在查找我程序中的错误上。

换句话说就是无bug,不生活

前面提到过,bug不仅仅只在程序中发生,对于硬件同样有可能由于设计原因而产生各种各样的bug,不过在这里我们主要讨论编程中的bug。

由于程序员的疏忽造成的程序漏洞,在所有bug中占据了绝大多数。

例如在c语言中,在判断两个表达式的值是否相等时所使用的==符号,很容易就会手一抖写成了一个=。(这是新手常犯的一个错误)

这样,一个bug便产生了,例如下面这样一段代码,其中foo为一个int类型的变量

 if (foo = 1) 
{
 //一些代码 
}

这里本来是准备将foo与数值1进行比较,然而却写成了赋值

于是乎括号内的表达式永远为真(因为永远为1),更糟糕的是,foo的值为此变成了1。

这样的程序并不一定每次都会暴露出问题,例如foo真等于1的时候我们便会得到正确的结果。

为了避免这样的bug,有些人提出了一种解法,将判断操作符两边颠倒,即将变量写在后后面,而将判断的值写在前面。

如上例中写成1 == foo

使用这种写法时,如果你因为手滑少写了个=,便成了1=foo,这样便会造成一个语法错误(无法通过编译),从而从源头消灭它

 

其次,由于c语言不会对(函数内定义的)变量进行初始化,因此使用这些变量,你得到的是一个垃圾值,这也是bug的一个源头。

 

c语言最容易引起bug的地方在于指针和数组,而这两样我们现在都还没有学到

因此我们会在对应的章节谈到注意事项

在Quora上有人曾经提问过“你遇到的最难调试的bug是什么”,你可以点这里访问(当然是英文的)https://www.quora.com/Whats-the-hardest-bug-youve-debugged

而知乎上也有着一个类似的问题:“最难调试修复的 bug 是怎样的?”

http://www.zhihu.com/question/21991014

从里面的回答中你可以看到各种稀奇古怪的bug

下一篇文章,我们讲了解bug这个名称的来历

发表评论

邮箱地址不会被公开。 必填项已用*标注