为什么不存在没有bug的程序?

不管怎样debug都不可能把所有的错误挑出来吗?

推荐  (0) | 46人关注关注
48个答案
9 1

精英王子高中退学,独立开发者,独立博客作者,深度 Git...

2012-12-13 18:45

因为bug是一个相对的概念,你认为是bug,但别人可能认为这是功能
一个功能,今天可能算功能,明天就可能是bug

7 0

zhangyang非确定有限状态自动机

2013-04-22 17:16

呃,这个算是计算机科学最前沿的问题了吧。
程序的运行过程(尤其那些有输入输出的程序)是非常复杂的,复杂程序的运行路径几乎是无穷多条,人力怎么可能证明每条路径都是正确的?
一般想到都是用数学形式证明,但因为什么是bug根本无法定义,形式证明只能解决一部分问题。
https://zh.wikipedia.org/wiki/%E5%BD%A2%E5%BC%8F%E9%AA%8C%E8%AF%81

7 1

我很意外这么大众的一个问题没有让我满意的答案,那我尝试说明一下:
1972年图灵奖获得者,大神Edsger W. Dijkstra总结过:“Testing shows the presence, not the absence of bugs”。本质来讲有没有bug是个不可判定问题(undecidable),所以只能发现bug,不能说“没有bug”。举个例子:
if (哥德巴赫猜想成立){
楼主比我帅 //这明显是错的!
}

请问这段代码有bug吗?如果哥德巴赫猜想成立,那么它有bug。天知道哥德巴赫猜想成立不?这段代码永远停滞在这里直到哥德巴赫猜想有证明结果为止。如果把条件中的哥德巴赫猜想换成一个已知是不可判定的问题,这就更无厘头了。

6 0

我觉得大概可以这么理解,越复杂的东西,越容易出错。比如说一个50%出错几率的零件,系统中只用一个零件,那么系统出错几率是50%,两个是75%,三个就是87.5%……所以随着系统复杂度的上升,bug无法避免。理论上来说,只要做了足够多的测试,测试过了所有可能的case,应该能查出所有bug来。但是实际上这个是不现实的,成本无法接受,也许99%的defect被发现,但是为了发现剩下的1%,往往会花费远比发现那99%多得多的成本,带来的收益却很有限。并且,实际工作中为了修复一个defect,导致更多defect产生的情况屡见不鲜。从风险控制的角度来说,我们不会追求消灭所有的bug,只是在软件存在bug的风险和软件成本中间找一个平衡点。撇开程序不谈,人类进化了三百万年,也还是生老病死,各种遗传性疾病屡见不鲜,还有癌症这种系统自身崩溃的重大bug。但是进化很大程度上只是尽力避免种群被灭绝的风险,这一点上显然人类足够成功,那就够了……

4 0

PuNaDSmile果壳“万有青年”品牌负责人

2012-12-14 00:19

白天不懂夜的黑

4 1

我想,一个很重要的原因,是我们对逻辑做不到100%的把握所致。

诚然,有为数不少的bug是编程语言语法,或者某种语法机制上本身存在的漏洞所致
——这可以认为是语言创制者留下的bug.

比如C语言里的数据类型不匹配,数组,指针越界 之类。

这种bug,在强调了一定的编程规范或者使用更严格的语法检查器后,比如pc-lint,在感觉上,会让我们觉得有望根治。

然而,另一种更常见的错误是 逻辑错误。

让你写一个只有五六行的helloworld,你可以做到没bug;
让你写一个软(件的)数据锁存器,也许你也可以做到没bug;

但是如果让你写一个10K甚至50K行规模的C代码,你可以保证你所做的逻辑结构100%是正确的?

我想,没人敢那样说。

既然 逻辑都错了,或者有漏洞,还有谁敢说,这样的程序是无bug;

3 0
支持者: poper LePtC 精英王子

关于helloword 有木有bug 首先定义一bug是什么, 在我们这个鸟公司, 客户的不满就是bug。在这个前提下我们推出了一个win8版本的helloword, 为了让界面更骚,我们用了metro, 然后兴致勃勃发给客户,客户收到以后充满基情的安装 发现无法运行, 哦 shit , 客户竟然还在使用win98, 尼玛啊, 这难道是win8的舅舅么? 好吧这时候前端技术实施电话过来吼了, 你们这帮熊孩子,搞这么严重的bug。 你看看bug无处不在,时时刻刻就会出现。 并且总是在基情高潮的时候到来, 像不像月经?

3 1

十强武者“苹果”富可敌国 乔布斯创新不止

2012-11-22 12:56

不是,有的程序就没有bug,比如不让你进行任何操作的程序

2 0

架構夢想程序猿 代码格式化洁癖 理想主义洁癖 等

2012-12-13 11:07
支持者: 辛昕 子墨君

debug只能解决代码的错误.但是很多错误是业务方面的错误.也有人自身思维的错误.
比方说人工智能....

2 0
支持者: 我爱过果壳 Bcnof

其实hello world也是可以有bug的。。。若是处理器来了个微妙的bug。。哈哈

还别说,真有这事。google一下,你就知道

2 0
支持者: watheya 辛昕

好歹当码农有段时间了, 没学过高深理论,我试着回答一下,

从逻辑上讲, 没有什么理论思想在任何条件任何认识下,都一定正确 不是吗? 我觉得没有, 通俗的说1+1一定等于2吗, 看是什么人回答了. 既然思维逻辑上存在不确定性, 那么, 程序逻辑上可能有Bug很正常, 程序仅是思维的表现么.

从实现上讲, 你无论你写多么简单的东西, 都要依赖外部现有的东西, 外部实现的可靠性就没有绝对的100%, 你的程序就不可能有100%的可靠性. 例如, 就算是最简单的在printf Hello World也要用到系统复杂的输入输出系统. 较真的你可能会说你要用汇编, 实现最简单的程序, 但你一样会依赖CPU的解释程序, 即使它们绝对没有问题, 硬件也没有100%的可靠性, 它们只是在常温室内等条件下 比较可靠而已.

之所以没看到Bug, 仅是你没开启触发Bug的条件而已, 程序猿与Bug的命运是注定的哈.

以上, 轻喷.

1 0

AI油泳的鹰勘查技术与工程专业,编程爱好者

2012-12-13 20:53
支持者: 我爱过果壳

#include <stdio.h>

int main()
{
printf("This is a program which have no bug.\n");
return 0;
}

1 0

RHODE电子农场的游牧民

2013-01-11 09:41
支持者: 艾斯昆

个人认为

BUG问题和数学猜想是一样的,没有前题说BUG没有意义。

大众点的例子就是:一个程序,其他情况不变,一个人用没有问题,一百个同时人用,一千个人同时用就不一定没问题。
硬件之间的不同也会引发问题,有的可能莫名奇妙。

1 0
支持者: 辛昕

其实我感觉是这样的 程序往最底层延伸的时候其实都是调用的算法包括操作系统提供的接口 函数等都是由算法组成的 当各种算法结合以后 程序就不那么严谨了 所以没有不存在BUG的程序 只有没发现BUG的程序

1 0
支持者: 我爱过果壳

我们做了一个1.5MB的系统,和Windows一样的,就没有BUG……

1 0
支持者: 桴子儿

只能判断一个东西“有”,而不能判断一个东西“没有”

1 0
支持者: bmrwozzmrj

停机问题就是bug的祖宗吧,所以任他什么程序,永远有大于等于一个bug。

1 0

沙场飞火理学学士;PG;脑门控;EVA控;科幻;MES

2013-04-24 16:47
支持者: 我爱过果壳

就算一个小程序,调试修改成0个BUG的状态,后面还有成百上千条waring跟着呢

1 0
支持者: 我爱过果壳

好奇怪 这个问题本身就是有问题 没有给出bug的定义 度娘的贴吧个有起源
第一代的计算机是由许多庞大且昂贵的真空管组成,并利用大量的电力来使真空管发光。可能正是由于计算机运行产生的光和热,引得一只小虫子(Bug)钻进了一支真空管内,导致整个计算机无法正常工作。
如果把bug定义为可能无法实现程序本身的目的 那么没有bug的程序不存在 hollo world?没有bug?java是高级语言 我理解为媒介 计算机只能看懂10看不懂hollo world 把电脑上的java卸了那hollo world也变成了bug 因为无法在屏幕上打印 违背了初衷 或者更干脆 把显示器砸了 这样定义 那么程序都有bug这句话就不仅限于计算机程序 拿最简单的膝跳反射 反射弧的5个部分哪个部分钻进了“bug”都会影响结果 没有限定条件拿句口号来空谈会被骂死的→_→ @都是扯谈 顺便吐槽楼上的1 1等于2 在《1984》条件下它不成立谢谢

1 0

是你无法证明一个程序没有bug,而不是不存在。

0 0

__失文程序渣渣员

2013-01-12 00:05

这是个哲学上的问题,今天刚考完马原的人面无表情的说……

0 0

我觉得是没有完美的程序,永远都有改进的可能。即使是hello world!

0 0

只要人会出错,BUG就会一直存在。谁让程序是人写的呢!

0 0

一个标准的程序应该有输入和输出吧? 那么在这两个过程中很难保证在任何情况下都不会出错。所以还是会有小虫子的

0 0

把这句话的深度推到"不能自证",有点深了,貌似我们周围所有的逻辑系统都不能自证.

我觉得这句话可以这么理解,"不存在没有bug的有需求的程序",无需求的程序自然是没有bug的,有需求的程序一定会有bug.
比如hello,world.他的本身你当然没办法说对错,但是当你界定了需求,那就有了.
如果你把它当成一个教材类的演示用程序,那有些人可能通过这个程序并不能理解C语言(假设这个程序使用C语言写的)的基本输出方式,你甚至可以找出n个理由说明这个例子不适合用于教学.
如果你把他当成一个测试程序,测试一个机器能不能跑(X86构架下的程序),一台苹果机也有很小的几率通过测试,那他也不是一个完美的测试程序.

0 0

这个不是技术问题,个人认为程序是人类解决问题方法的抽象总结,只要是人的想法,就有不足和漏洞,这个取决于解决问题的角度和环境

谁说helloworld没有bug的,内存不够怎么办,有做处理了吗。但凡需求要求输出Helloworld,你搞成了helloworld,这也是Bug

0 0

想起了一哥们的名言:我的程序没BUG,如果有,那一定是微软的 :D

0 0

现在的程序bug一般不是出现在算法上,编译也不会有问题,问题是在流程上,是设计缺陷,这叫bug。有bug不是运行不了,而是运行错误、运行了非程序设计者预想的路径、得到了非预期的结果,不是debug就可以的

0 0

debug只能证明程序没有错,却不能证明程序是正确的。
——谁说的我忘了

0 0

夜猫子科c++码农,自学web中...

2014-04-20 19:43

并非不能完全消灭bug,前提是需求不变,测试时间充足,但实际上为了迎合市场,产品经理或领导,程序经常会改变,改变就会有新的bug产生。

另外一个原因是程序的规模不断变大,在30年前的程序,1万行以内的程序比比皆是,但如今,需求越来越复杂,程序为了满足各种需求 ,自然代码行数提高,举个例子,具体到某些软件,如果需求增加N个,且这些需求之间,或与旧的需求是有相互关系的,那么复杂度不是以线性增加的,而是以指数级别增加的。 程序员难以hold住这么多细节,只能以测试辅助找出bug,但难免会有漏网之鱼。

总体来说,现在的软件方法论只是降低bug发生的概率,但面对现在对软件各种奇葩需求的修改,软件方法论也hold不住啊。

0 0

看要实现什么机制,有的时候在实现多重机制的情况下,逻辑代码按照你的思维去运作,但在其他环境下,其他情况下,你所编写出的代码将会不可避免的出现纰漏,因为你没有想到复杂环境下的程序状态,尤其是多重机制。
这个BUG是永远都解决不完的,你这样修改在你可视的环境中他运行的很好,但换种情况换种环境,问题就会出现,那些看起来没有BUG的程序其实是在已知环境下控制漏洞到最小,但不能完全消灭。
人类本身就有BUG,何况所产生的思维以及代码。

0 0

Jove被电脑玩的

2014-05-08 10:31

想想无限不循环小数,你越算,近似程度越高,但还是无法结束。

0 0

EddyBai菜鸟程序员

2014-05-28 15:07

我觉得也是相对而言的。我程序里有个死循环,这是不是bug?

0 1

就算程序本身没错,遇上奇葩的使用者照样会出问题...(有多少人会看软件的说明书来着?)

0 2

我觉得因为程序没有完美的思维,是死的,不能如生物般完美,必然有bug。非生命体

0 6

谁告诉你 程序就一定有BUG了 像一些简单的程序就没有BUG 即便是复杂的 也可能没有BUG 比如火箭 宇宙飞船 高铁 那可是关系到生命的

查看更多

添加回答

登录 后回答问题,你也可以用以下帐号直接登录

相关问答

关于我们 加入果壳 媒体报道 帮助中心 果壳活动 家长监控 免责声明 联系我们 移动版 移动应用

©果壳网    京ICP证100430号    京网文[2015] 0609-239号    新出发京零字东150005号     京公网安备11010502007133号

违法和不良信息举报邮箱:jubao@guokr.com    举报电话:18612934101    网上有害信息举报专区    儿童色情信息举报专区