译者 | 张洁
责编 | 屠敏
出品 | CSDN(ID:CSDNnews)
Hello World 可能是最简单的计算机入门程序 。 几十年来 , 许多人在开始使用新的编程语言时 , 编写的第一个程序通常是 Hello World 。
这不起眼的入门程序没有 Bug , 对吗?
文章图片
图片来自 sunfishcode 的博客
毕竟 , Hello World 程序只做一件事 。 怎么会有 Bug?
万万没想到 , 有开发者在好奇心驱动下 , 测试了 16 种常用的语言后 , 竟然在里面检测出了 7 种编程语言的 Hello World 带有 Bug 。
以 C 语言中的 Hello World 程序为例
首先 , 以 C 语言为例来测试 。 事实上 , 用 C 语言写 Hello World 有很多不同的版本 , 如维基百科搜索显示的版本、《C 程序设计语言》(也简称 K&R)一书中的 Hello World , 甚至还有从 1974 年贝尔实验室备忘录中引入的最古老的 C 语言 Hello World 程序 。
文章图片
图片来自 sunfishcode 的博客
这是 "ANSI C "(美国国家标准协会和国际标准化组织对 C 语言发布的标准)中的 Hello World 程序写法:
对于业界而言 , 这应该是最标准 C 语言 Hello World 的版本 。
它使用“(void)”来显示 main 是一种新型声明方式 。 这个版本使用 EXIT_SUCCESS 返回值来表示成功 , 而不是使用 0 。 根据 C 语言标准 , 这其实没有必要 , 不过在此我们也不做更改了 。 除此之外 , 它还使用了适当的头文件声明了 puts 函数 。
这个版本试图把所有的步骤都做到完美 。
然而 , 它里面还是有一个 Bug 。
C 语言中的 Bug 从何而来?
Linux 有一个有趣的设备文件 , 叫做“/dev/full” , 跟“/dev/null”(程序员群体中行话叫做黑洞 , 即丢弃一切写入其中的数据 , 读取它会立即得到一个 EOF)非常像 , 但是当你将数据写入到“/dev/full”时 , 该文件不会扔掉数据 , 而会出现错误 。 它的作用就像是文件系统中一个刚刚用完空间的文件:
所以让我们测试一下上面的 C 语言示例:
然而 , 它实际上并没有成功 。 我们可以使用 strace 进行确认:
那么 , 这个 Bug 有多严重呢?
可以说 , Hello World 不应该作为标准的测试代码 , 因为它并不是绝对的安全 。
特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
