文章
Slash Boxes
评论

Solidot 登录

登录

[ 创建一个新帐号 ]

gcc不能区分正数和负数

matrix 发表于 2007年11月19日 13时10分 星期一   Printer-friendly   Email story
来自i-doubt部门
bhpan 写道 "linux程序不能区分正数和负数,例如,-10和10会被认为是相等的。真的是这样吗?试试以下的C代码:
int main () {
                int i=2;
                if( -10*abs (i-1) == 10*abs(i-1) )
                                printf ("OMG,-10==10 in linux!\n");
                else
                                printf ("nothing special here\n");
}
同样的C代码,在windows和unix系统中编译运行的结果是nothing special here,只有linux得到是-10==10。
恩,我们的gcc在这里犯了一个低级错误。"
This discussion has been archived. No new comments can be posted.
显示选项 门槛:
声明: 下面的评论属于其发表者所有,不代表本站的观点和立场,我们不负责他们说什么。
  • cyfdecyf (2588) 发表于 2007年11月19日 13时32分 星期一 (#12511)
    Linux 下用 intel 编译器就没有问题,gcc 这个有点莫名其妙啊
  • trying...

    (得分:1)
    kcome (1409) <harryl.byreadNO@SPAMgmail.com> 发表于 2007年11月19日 13时38分 星期一 (#12512)
    ( https://twitter.com/kcome )
    应该和abs函数有关系,说linux不识别正负数有点标题党了
    正在测试,如果-10*和10*改成了-1和1就不会出错,但是如果任何绝对值大于1的整数,都会出现这样的毛病
    另外abs里面如果没有变量,都是常量也没有问题
    --
    若为自由故·二者皆可抛
    自由·科学·民主

    • Re:trying... by kcome (得分:1) 2007年11月19日 13时42分 星期一
  • 顶多gcc的问题

    (得分:3, 识见广博)
    palxex (1444) 发表于 2007年11月19日 13时51分 星期一 (#12515)
    不过的确,在linux下的gcc4.2和windows下的gcc3.4.5测试都能得出可恶的-10==10…… 但是将那一步abs外化的几次努力,都会回到正常的结论,所以不大可能是单纯的序列点问题。查了下头,abs也不是宏而是函数实现。那下面自然推论就是解析树有毛病了,有闲的筒子去看看源代码吧。
    --
    温水煮不死青蛙,它只煮得死中国人。
  • 不是Bug吧。。

    (得分:1)
    anykey (6736) 发表于 2007年11月19日 14时16分 星期一 (#12517)
    编译器本来在很多问题上就没有统一的标准。不可能所有的编译器编译的结果一样。 如果这是bug的话,那我能写出N个其它的同类型的“bug”:y++ + ++y....
  • 来源?

    (得分:1)
    oldrev (5774) 发表于 2007年11月19日 14时20分 星期一 (#12519)
    试了一下,果然如此,不知是那个牛人发现的。无论怎么用括号调整优先级,结果都是错的。
    • Re:来源? by oldrev (得分:1) 2007年11月19日 14时23分 星期一
  • It's a bug of gcc

    (得分:2, 识见广博)
    匿名懦夫 发表于 2007年11月19日 14时22分 星期一 (#12520)
    你有两种方法: 1,-fno-builtin 2, 给gcc打patch. fold_const.c } break; } + /* If the constant is negative, we cannot simplify this. */ + if (tree_int_cst_sgn (c) == -1) + break; /* FALLTHROUGH */ case NEGATE_EXPR: if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
  • 如上

    (得分:1)
    konit (966) <-> 发表于 2007年11月19日 14时24分 星期一 (#12522)
    ( 最新日志: 2010年1月27日 01时12分 星期三 )
    建議反匯編生成的代碼看看,是不是優化時做錯了什么?cmp和跳轉的那一步。
    --
    Range bound is time box.
  • 题外话

    (得分:1)
    gastlygem (3239) 发表于 2007年11月19日 15时16分 星期一 (#12525)
    ( http://gastlygem.com/ )
    用Google Reader订阅收看到的本条信息中,代码之间插满了&nbsp,格式全乱掉了……
  • palxex (1444) 发表于 2007年11月19日 15时25分 星期一 (#12526)
    http://www.nabble.com/-PATCH--Fix-PR34130,-extract _muldiv-broken-t4826688.html [nabble.com] 前天的一个补丁已经修正,话说投递的大虾不是看到以后构造的吧- - 推断错误,还真跟语法解析没关系(虽然的确是那儿的代码),而只是gcc对abs的优化造成的。看起来gcc将abs这个标准库函数以builtin的形式实现,虽然不是宏,但优化时还是漏了一眼,在那处case下将不可直通下去的带负号情况给通了过去。
    --
    温水煮不死青蛙,它只煮得死中国人。
  • 修改一下吧,不是Linux的问题

    (得分:2, 识见广博)
    raptor (2253) 发表于 2007年11月20日 15时24分 星期二 (#12563)
    是GCC的优化问题,我们至少在Windows和HP-UX这一个UNIX平台上试过了,一样错。 详见我的BLOG:http://blog.csdn.net/Raptor/archive/2007/11/19/1893079.aspx
  • 还有 1 reply 在你当前的门槛设置之下。