乱动Linux内核代码会发生什么
王丢兜 @ 2015.11.03 , 08:30 下午[-]
Linus Torvalds是一名传奇性的软件工程师和Linux内核的创造者,他对烂代码也不能忍,所以,坐好,拿出爆米花,欣赏吧。
对于赫然出现在Linux 4.3版本中的一些新代码,Torvalds贴出了这条回应,帖子很技术化,但即使你看不懂其中的精妙,每个人都能欣赏那娴熟的吐槽:
天哪,这伙人,这就是一坨翔
我得到这个冲突是因为愚蠢的新gcc头文件垃圾,但让我烦躁的是这货的存在理由完全不成立。
这是net/ipv6/ip6_output.c里的旧代码:
mtu -= hlen + sizeof(struct frag_hdr);
而这是新的“改进”代码,使用了需要魔法般内置编译器支持的花哨货色,而且当支持不存在时还带有傻冒的包装器函数:
if (overflow_usub(mtu, hlen + sizeof(struct frag_hdr), &mtu) ||
mtu <= 7)
goto fail_toobig;
任何人要是认为以上代码(a)易读 (b)高效(甚至在有魔法般编译器支持时) (c)尤其是安全的,都是无能的神经病。
以上代码就是一坨翔,而且它生成的代码也是翔一样的,它看上去就烂,没有任何理由存在。
该代码本可以用仅仅一个容易理解的条件来轻易实现,而且编译器实际上本可以生成更好的代码,而且这个代码会更好看、更容易理解,为什么不写成
if (mtu < hlen + sizeof(struct frag_hdr) + 8)
goto fail_toobig;
mtu -= hlen + sizeof(struct frag_hdr);
这个行数是一样的,不使用没人知道它们在干什么的疯狂的辅助函数,它实际上做什么也更加明显,我保证第二个更明显的版本更容易阅读和理解,有任何人真的想争辩这个吗?
真的,给我一个理由它为什么要用两个不同的条件写成这么白痴的方式,还有一个簇新的非标准函数,要求特定的编译器支持来生成半吊子代码?一个我们在其它任何地方从来不曾需要过的崭新函数,这简直就是编译器□□。
对,如果整个“hlen + xyz”表达式溢出了,你还是会有溢出问题,但很坦率地说, “overflow_usub()”代码也一样,所以如果你操心这个,那么你一开始根本就没做对。
所以我真的看不出这种完全白痴的垃圾有任何理由。
告诉我为什么,因为我不带这种生成rc7时冲突的完全疯掉的东西,而且看来绝对没有理由有这种愚蠢的不可读的一团糟。
这个代码看来是被设计成来使用那坨新的“overflow_usub()”代码,看上去就是个使用这个函数的借口。
真是个[哔~]了狗的脑子坏掉的烂借口。
对不起,但是我们不为那样的白痴新代码增加这样的白痴新接口。
对,对,如果这货呆在网络层里,我本来从不会注意到它,但既然我已经注意到了,我真的不想要这货,事实上,我要让每一个人都清楚,这样的代码是完全不能接受的。任何人如果认为这样的代码因为使用了花哨的溢出检测函数,就是“安全”(原文为safe,不出错)和“安全”(原文为secure,不被黑)的,都是神志不清到根本就不搞笑的地步。所有这些垃圾所做的就是用神经正常的人永远不会真正理解它在干什么的代码把代码变成没法读的一团糟。
给我把它干掉,我再也不想再看到这坨翔。
Linus
教训就是:不要乱搞Linus的代码。
PREV : 为什么恐惧和害怕会影响动物的肉质
NEXT : 日本电影让机器人演机器人