当前位置:首页 > 开发 > 编程语言 > 编程 > 正文

Erlang中有意思的bug

发表于: 2011-12-06   作者:bookjovi   来源:转载   浏览:
摘要:   代码中常有一些很搞笑的bug,如下面的一行代码被调用两次(Erlang beam) commit f667e4a47b07b07ed035073b94d699ff5fe0ba9b Author: Jovi Zhang <bookjovi@gmail.com> Date: Fri Dec 2 16:19:22 2011 +0100 erts:

 

代码中常有一些很搞笑的bug,如下面的一行代码被调用两次(Erlang beam)

commit f667e4a47b07b07ed035073b94d699ff5fe0ba9b
Author: Jovi Zhang <bookjovi@gmail.com>
Date:   Fri Dec 2 16:19:22 2011 +0100

    erts: Remove duplicate erts_unblock_fpe
    
    The second function erts_unblock_fpe is not needed in here.

diff --git a/erts/emulator/beam/io.c b/erts/emulator/beam/io.c
index c2cc035..759621d 100644
--- a/erts/emulator/beam/io.c
+++ b/erts/emulator/beam/io.c
@@ -644,7 +644,6 @@ erts_open_driver(erts_driver_t* driver,     /* Pointer to driver. */
                                    name, opts);
        erts_unblock_fpe(fpe_was_unmasked);
        port->caller = NIL;
-       erts_unblock_fpe(fpe_was_unmasked);
        if (IS_TRACED_FL(port, F_TRACE_SCHED_PORTS)) {
            trace_sched_ports_where(port, am_out, am_start);
        }
 

已经unblock了一次,结果又unblock了一次,应该是代码作者的粗心导致的,有意思的是这行代码在erlang的git初始版本中就有了,存活了3年甚至更久,而且经过无数个人的review竟也没有发现。

 

在Linux kernel中也有这样的低级错误,记得以前看见过在pipe.c中的一个patch,作者本意是a=b,结果写成了b=a,那个错误存在了十几年,为什么没有被发现呢?因为那个代码分支一般很难跑进去!

commit e5953cbdff26f7cbae7eff30cd9b18c4e19b7594
Author: Nicolas Kaiser <nikai@nikai.net>
Date:   Thu Oct 21 14:56:00 2010 +0200

    pipe: fix failure to return error code on ->confirm()
    
    The arguments were transposed, we want to assign the error code to
    'ret', which is being returned.
    
    Signed-off-by: Nicolas Kaiser <nikai@nikai.net>
    Cc: stable@kernel.org
    Signed-off-by: Jens Axboe <jaxboe@fusionio.com>

diff --git a/fs/pipe.c b/fs/pipe.c
index 279eef9..37eb1eb 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -382,7 +382,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,
                        error = ops->confirm(pipe, buf);
                        if (error) {
                                if (!ret)
-                                       error = ret;
+                                       ret = error;
                                break;
                        }
 

结论:仔细review你的代码,尽管你写了无数行的代码,尽管你已是一个公认的技术专家,你的代码中仍有可能存在着一些非常低级的bug.

 

 

Erlang中有意思的bug

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
浏览网页时经常会遇到404错误页面,如果是白色页面,然后给个数字404再加一段枯燥的文字说明,很多
一枚小Bug的独白(挺有意思的~) 我是一枚潜藏在数据库引擎深处的Bug,躲在一个黑暗的角落很久了,历
之前做项目,遇到一个问题,记录一下。 开始一直以为是内存溢出,查了半天,还是没搞明白什么错误。
我们公司有个测试人员给我提了一个有趣的bug,有一个快捷键ctrl+1,但是他用了另一种方法触发了它. 他
虽然 Erlang 的广告说得非常好,functional、share-nothing、消息传递,blah blah 的,好像用 Erlan
在把vc6.0下的项目移植到vs2005下,将所有的编译错误都改完了,然后运行出现: HEAP[****.exe]: Inv
epmd进程和Erlang节点进程如影随形,在Rabbitmq集群,Ejabberd集群,Couchbase集群产品文档中都会有相
 转载自http://www.cnblogs.com/me-sa/p/erlang_notes_129.html Adding special-purpose proces
Maven中有三大模块 在Maven中有三大模块,分别是依赖、仓库、生命周期和插件,我们接下来下来介绍下
NetBeans6.1里的插件非常的丰富,今天看到了一个很有趣的插件,可以把类图形化的查看,废话不多说,
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号