科技信息资讯,更全更新信息实报!
首页 > IT业界> 正文

运行个 Hello World 也能出 Bug?Python、Java、C++ 等 16 种语言中枪,最严重可导致文件丢失

来源: 发布时间:2022-03-21 16:14

一句最简单的 Hello World,居然也会出 Bug?

倒不是这句代码还能写错,而是运行时找到了许多操作系统对异常处理的漏洞。

在向 /dev/full 输出结果,也就是设备空间不足、任何写入都应失败的情况下,C 语言依然返回了 0,成功退出:

$gcchello.c-ohello$./hello>/dev/full$echo$?0

Bug 的最初发现者表示:这可不是一个小错误,本质上是“打印到标准输出”的任务。

发生了错误但不抛出异常,意味着即使出现数据丢失,进程依然会继续运行。

于是他一不做二不休,又测试了 C++、Python、Java 等热门语言,发了篇博客,很快就在论坛盖起了高楼,讨论度直接爆了:

而评论区网友一通 Debug,综合整理下来,踩中这一 Bug 的语言,竟足足有 16 种之多!

Hello World 的 DeBug 过程

最初的发现者是一名名叫 sunfishcode 的技术博主,他在博客里展示了 C 和 Python 两种语言的详细的 deBug 过程。

主要使用的是 Linux 系统下的一个经典的设备文件,/dev/ full。

/dev/ full 总是在写入时返回设备无剩余空间(错误码为 ENOSPC),常常用于测试程序能否正确处理 I / O 错误。

如果程序正常,那么就会返回错误报告:

$echo"HelloWorld!">/dev/fullbash:echo:writeerror:Nospaceleftondevice$echo$?1

而正如我们开头所示的代码,在用 C 语言进行输出时,hello 程序却报告成功,返回了 0。

用 strace 命令跟踪这一进程产生的系统调用可以发现,程序确实出现了故障:

$strace-etrace=write./hello>/dev/fullwrite(1,"HelloWorld!\n",13)=-1ENOSPC(Nospaceleftondevice)+++exitedwith0+++

而以“错误不该被悄悄传递”为口号的 Python 也着了道。

程序向 stderr 打印了一条消息,丢失了信息,但最后也返回了 0:

$python2hello.py>/dev/fullclosefailedinfileobjectdestructor:sys.excepthookismissinglostsys.stderr$echo$?0

这个 Bug 严重吗?现实世界任何一个程序都不会拿 Hello World 当作关键性安全问题,但“打印到标准输出”却是现实中确实会有的程序任务。

而这也正是 Hello World 这个最简单的程序的本质。

博主 sunfishcode 这样说:

标准输出可能意味着一个具体文件,那么如果这个文件刚好耗尽了空间,程序又因为 Bug 没有检测到这一错误呢?

父进程不会知道子进程失败了,只会继续运行。但期望生成的输出实际上已经丢失了数据。

当然,博主在最后也给出了没有踩雷的语言列表:

网友热议:这到底算不算 Bug?

目前,博主已经针对这一 Bug 给出了一些解决方案,比如在 C 语言环境中可以采用这样的方法:

#include<stdio.h>#include<stdlib.h>intmain(void){printf("Hello,World!\n");if(fflush(stdout)!=0||ferror(stdout)!=0){returnEXIT_FAILURE;}returnEXIT_SUCCESS;}

而评论区也贡献了 Java 环境中的解决方案,即添加一个方法来获得底层的、未包装的 OutputStream:

System.out.println("HelloWorld!");if(System.out.checkError())thrownewIOException();

下方还有人补充到,Java 已经引入的 RuntimeIOException 就可以用于 I / O 异常出现意外的情况:

因此我们可以引入一个新的类,比如 ErrorCheckingPrintStream,并将“ErrorCheckingPrintStream withErrorChecks ()”方法添加到 PrintStream 中。

而除此之外,评论区热议的一个话题就是:

这位博主所公布的问题到底算不算是一个 Bug?

反对者直言作者是在标题党,还以为是发现了什么 C 语言标准库里的 Bug,但实际上只是处理所有可能的系统调用的失败情况:

Hello World 只是简单地将 API 调用到文本界面,对一个简单的接口进行调用,我在那里没有发现过任何 Bug。

有赞同的评论在下方做了进一步的补充,他认为 C 语言的编写方式里本来就写明:程序不关心任何形式的错误条件。

包括 printf 的返回值被忽略、输出不被刷新、刷新的返回不被检查、不关心 errno 值等等。

所以,用户本就不应该期望给定的系统调用返回额外的 errno 值,而是应该用特殊方法处理特殊情况。

甚至有人表示:程序的失败不是由程序控制结构定义,而是由需求定义,Hello World 程序的需求难道包括主机系统的所有错误边界吗?

也有人更赞同作者,认为 Hello World 不只是接口调用,实际是在要求操作系统在某处写入数据,而这正是简单的程序与现实世界相关联的地方:

这是一个严重的问题,而似乎在大多数时候,这种看似简单的功能中存在的大量复杂性都被忽略了。

还有另辟蹊径,从教育的角度来看的评论:

毕竟 C 语言时很多程序员的入门语言,hello.c 又是其中的第一个程序,要让初学者更好地理解控制结构,块,返回值,缓冲流的,printf 格式化语言等概念,所以还是把它当成一个 Bug 吧。

那么你又怎么看?

参考链接:

[1]https://blog.sunfishcode.online/Bugs-in-hello-world/

[2]https://news.ycombinator.com/item?id=30611367

[3]https://github.com/sunfishcode/hello-world-vs-io-errors

创业速递

更多 >

热门文章

  • 推动人工智能在规范中发展,大咖们上演“头脑风暴”
    推动人工智能在规范中发展,大咖们上演“头脑风暴”

    推动人工智能在规范中发展,大咖们上演“头脑风暴”

    人工智能是引领未来发展的战略性技术,也是新一轮科技革命和产业变革的重要驱动力量。近日,一场立法征集意见座谈会在湾谷科技园杨浦区人...

  • 电商平台齐力拧开消费增长阀门 扶持中小商家激发生
    电商平台齐力拧开消费增长阀门 扶持中小商家激发生态活力

    电商平台齐力拧开消费增长阀门 扶持中小商家激发生

      今年618处于消费提振关键期,是刺激消费、重拾信心的重要节点。从京东、淘宝天猫、抖音、快手、美团、小红书等平台公布的618数

  • 阿里变革顺利推进 张勇专职阿里云 蔡崇信吴泳铭接
    阿里变革顺利推进 张勇专职阿里云 蔡崇信吴泳铭接任集团董事长和CEO

    阿里变革顺利推进 张勇专职阿里云 蔡崇信吴泳铭接

    6月20日,阿里巴巴控股集团董事会主席兼CEO张勇通过全员信宣布,阿里的自我变革正顺利平稳推进,1+6+N的全新业务集群基本成型

  • vivo X90s 上手体验:“青漾”勾画清凉夏
    vivo X90s 上手体验:“青漾”勾画清凉夏天 影像性能再度升级

    vivo X90s 上手体验:“青漾”勾画清凉夏

    中国网科技6月27日讯(记者 张润琪)炎炎夏日,难寻得一丝清凉,如今,vivo发布的X 90s全新配色青漾自带凉意属性,沁人心脾

  • 卡游向上海市消保基金会发起公益捐赠,致力文化消费
    卡游向上海市消保基金会发起公益捐赠,致力文化消费高质量发展

    卡游向上海市消保基金会发起公益捐赠,致力文化消费

    6月28日,上海市消费者权益保护基金会和卡游动漫共同发起守正创新 让青少年更好传承发展传统文化主题沙龙在上海举办。  该活动旨在

  • 荣耀Magic5 Pro三年磨一舰,荣获2023
    荣耀Magic5 Pro三年磨一舰,荣获2023年亚洲最佳智能手机奖

    荣耀Magic5 Pro三年磨一舰,荣获2023

     2023年6月30日,荣耀官方微博发布消息称荣耀Magic5 Pro再获奖项:2023年亚洲最佳智能手机奖。最佳智能手机奖曾于

人工智能

更多 >

物联网

更多 >