网易首页 > 网易号 > 正文 申请入驻

运行个Hello World也能出Bug?Python、Java、C++等16种语言中枪

0
分享至

博雯 发自 凹非寺
量子位 | 公众号 QbitAI

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

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

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

$ gcc hello.c -o hello
$ ./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 "Hello World!" > /dev/full
bash: echo: write error: No space left on device
$ echo $?
1

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

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

$ strace -etrace=write ./hello > /dev/full
write(1, "Hello World!\n", 13) = -1 ENOSPC (No space left on device)
+++ exited with 0 +++

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

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

$ python2 hello.py > /dev/full
close failed in file object destructor:
sys.excepthook is missing
lost sys.stderr
$ echo $?
0

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

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

博主sunfishcode这样说:

标准输出可能意味着一个具体文件,那么如果这个文件刚好耗尽了空间,程序又因为Bug没有检测到这一错误呢?
父进程不会知道子进程失败了,只会继续运行。但期望生成的输出实际上已经丢失了数据。

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

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

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

#include
#include
int main(void) {
printf("Hello, World!\n");
if (fflush(stdout) != 0 || ferror(stdout) != 0) {
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

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

System.out.println("Hello World!");
if (System.out.checkError()) throw new IOException();

下方还有人补充到,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

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
疑北大辅导老师曝光真实的孙宇晨!摆而不烂,躺而不平,半生反差太惊人

疑北大辅导老师曝光真实的孙宇晨!摆而不烂,躺而不平,半生反差太惊人

小徐讲八卦
2026-09-01 10:38:00
韩媒报道:朴彩英拒绝100亿韩元中国奶茶代言

韩媒报道:朴彩英拒绝100亿韩元中国奶茶代言

韩小娱
2026-09-03 15:24:07
“保不住香港,我们以死谢罪!”,解密惊心动魄的香港经济保卫战

“保不住香港,我们以死谢罪!”,解密惊心动魄的香港经济保卫战

文史道
2025-02-18 20:31:56
揭秘古人藏了千年的手相!无名指长于食指代表了什么?相书里那些看破不说破的话,藏着你晚年的结局

揭秘古人藏了千年的手相!无名指长于食指代表了什么?相书里那些看破不说破的话,藏着你晚年的结局

卡西莫多的故事
2026-07-15 16:59:45
中情局局长,“上门警告”

中情局局长,“上门警告”

中国新闻周刊
2026-09-03 11:32:07
注意!办理住院登记时,护士问“自费还是医保”,多数人可能踩坑

注意!办理住院登记时,护士问“自费还是医保”,多数人可能踩坑

荷兰豆爱健康
2026-08-16 08:31:21
哈里梅根不会出席戴安娜奖晚宴,如此一来威廉便可能会出席晚宴

哈里梅根不会出席戴安娜奖晚宴,如此一来威廉便可能会出席晚宴

谈点世
2026-09-02 22:54:23
我军“五虎将”,按军事才华如何排名?

我军“五虎将”,按军事才华如何排名?

【历史客栈】
2026-09-03 10:00:33
十几万香蕉烂满达沃码头,菲律宾张口甩锅,30万蕉农亏空真怪中方?

十几万香蕉烂满达沃码头,菲律宾张口甩锅,30万蕉农亏空真怪中方?

青眼财经
2026-09-03 19:46:13
德国宣布关闭俄驻波恩总领馆,普京发声:严重错误

德国宣布关闭俄驻波恩总领馆,普京发声:严重错误

环球网资讯
2026-09-02 21:15:28
51岁黄渤锁骨骨折消息曝光不到6小时,恶心的事情就发生了!

51岁黄渤锁骨骨折消息曝光不到6小时,恶心的事情就发生了!

叨唠
2026-09-04 00:01:53
一身红色蕾丝透视装,张靓颖熟透了

一身红色蕾丝透视装,张靓颖熟透了

吃瓜党二号头目
2026-09-04 09:26:51
这一次广西洪灾,被实名举报“假慈善”的韩红,打了多少黑粉的脸

这一次广西洪灾,被实名举报“假慈善”的韩红,打了多少黑粉的脸

小嵩
2026-07-08 19:35:28
彻查!信号强烈!中央升级反腐“天网”!

彻查!信号强烈!中央升级反腐“天网”!

职场资深秘书
2026-09-03 13:02:35
字节赌对了?Anthropic正式宣战蒸馏

字节赌对了?Anthropic正式宣战蒸馏

第四波
2026-09-02 17:04:10
《街霸》电影春丽演员发新照 丰腴大腿愈发还原

《街霸》电影春丽演员发新照 丰腴大腿愈发还原

游民星空
2026-09-01 21:16:34
广州网友称有家长抱孩子在南越王博物院展柜上趴着,小孩还不断用舌头舔玻璃;工作人员回应:有人巡场,看到会提醒,不会有安全问题

广州网友称有家长抱孩子在南越王博物院展柜上趴着,小孩还不断用舌头舔玻璃;工作人员回应:有人巡场,看到会提醒,不会有安全问题

潇湘晨报
2026-09-03 21:26:07
封神捡漏!阿森纳零转会费挖走曼联妖星!省下千万转会费

封神捡漏!阿森纳零转会费挖走曼联妖星!省下千万转会费

澜归序
2026-09-04 09:57:43
特朗普深夜开启全面空袭!导弹雨血洗海峡雷达,伊朗全国多地爆炸

特朗普深夜开启全面空袭!导弹雨血洗海峡雷达,伊朗全国多地爆炸

麓谷隐士
2026-09-04 01:00:03
街上越来越多女性不穿胸罩,高跟鞋几乎绝迹:这是身体的解放!

街上越来越多女性不穿胸罩,高跟鞋几乎绝迹:这是身体的解放!

另子维爱读史
2026-08-25 20:02:40
2026-09-04 10:23:00
量子位 incentive-icons
量子位
追踪人工智能动态
13258文章数 176548关注度
往期回顾 全部

科技要闻

OpenAI深夜王炸!GPT-6 Astra来了

头条要闻

牛弹琴:荷兰悄悄干了一件大事 值得高度关注

头条要闻

牛弹琴:荷兰悄悄干了一件大事 值得高度关注

体育要闻

梅西:巴萨10号与阿根廷10号

娱乐要闻

王宝强冯清八年未领证!真相令人泪目

财经要闻

电池税开征,纯电车利润快归零了

汽车要闻

限时权益价28.99万起 FREELANDER神行者8正式上市

态度原创

艺术
旅游
亲子
公开课
军事航空

艺术要闻

放大《汉宫春晓图》:撕掉宫斗剧滤镜,这才是明代深宫女子的真实日常

旅游要闻

长江边这座千年古镇的寺庙群里,竟然藏着一所中国顶尖大学的旧址,太令人意外了

亲子要闻

至今不知道我们面剂子到底有多少漂亮小衣服

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

乌特工内战街头对射 互认对方为"俄特工"

无障碍浏览 进入关怀版