Linux.ChinaUnix.net
ChinaUnix | Linux首页 | 新闻 | 博客 | 文章 | 专栏 | 新手 | 方案 | 图书 | 下载 | 人才 | 手册 | wiki | 搜索     
Linux论坛
  会员: 密码: 免费注册 | 忘记密码 | 会员登录 | 搜索



[开源业界] 微软Zunes播放器死机 源于开放源码严重bug
首页 » CU论坛 » Linux » 汇总贴列表 » 开源业界与评论 »  
[打印] [订阅] [收藏] [本帖文本页] [推荐此主题给朋友,立即获积分]
管理员 Send_linux
管理员-法王



CU奥运火炬传递手2008
CU编号: 149458
注册:2004-4-7
最后登录: 2009-07-04
帖子:15768
精华:7

可用积分:16019 (大富大贵)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:CAU
状态:...离线...

[个人空间] [短信] [博客]


1楼 发表于 2009-1-5 14:39 
在08年最后一天微软播放器Zunes 30GB发生大规模死机和锁定事件几天之后,驱动源代码就被泄漏到了网上。bug显然与判断闰年的语句有关,程序员们在分析后发现,闰年的判断上存在死循环,即当一年等于366天时,代码无法判断,因为定义的是(days > 366)。

驱动不是微软所写,而是飞思卡尔(Freescale)在GPL下发布的开源驱动。但从质量评估上看,微软的团队如果不是松懈的话,怎么会让这样大一个bug漏掉?这个bug影响到所有使用同一类型硬盘的Windows CE设备。

来源:solidot



您对本贴的看法:鲜花[0] 臭蛋[0]
yvmu   帅哥
圣骑士



CU编号: 186424
注册:2004-9-27
最后登录: 2009-06-13
帖子:137
精华:0

可用积分:53 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


2楼 发表于 2009-1-5 15:55 
别把微软的屎盆子往开源头上扣。 开源给你用,不等于替你背黑锅。



您对本贴的看法:鲜花[1] 臭蛋[0]

__________________________________

我很懒,但我很努力!
iamybj   帅哥 (apue & unp)
骑士



CU编号: 479564
注册:2006-10-21
最后登录: 2009-05-23
帖子:67
精华:0

可用积分:44 (白手起家)
信誉积分:100
专家积分:0 (本版:0)
空间积分:3
推广积分:0

来自:sd
状态:...离线...

[个人空间] [短信] [博客]


3楼 发表于 2009-1-5 16:04 
366天肯定是闰年。
判断闰年只需要用年就能判断!能被4整除但不能被100整除,或者能被400整除的年份。
哪个狗日的把我贴的源代码给删除了?
有问题的代码:
#define ORIGINYEAR 1980
BOOL ConvertDays(UINT32 days, SYSTEMTIME* lpTime)
{
    int dayofweek, month, year;
    UINT8 *month_tab;

    //Calculate current day of the week
    dayofweek = GetDayOfWeek(days);


    year = ORIGINYEAR;

    while (days > 365)
    {
        if (IsLeapYear(year))
        {
            if (days > 366)
            {
                days -= 366;
                year += 1;
            }
        }
        else
        {
            days -= 365;
            year += 1;
        }
    }

    // Determine whether it is a leap year
    month_tab = (UINT8 *)((IsLeapYear(year))? monthtable_leap : monthtable);

    for (month=0; month<12; month++)
    {
        if (days <= month_tab[month])
            break;
        days -= month_tab[month];
    }

    month += 1;

    lpTime->wDay = days;
    lpTime->wDayOfWeek = dayofweek;
    lpTime->wMonth = month;
    lpTime->wYear = year;

    return TRUE;
}


修改后的代码:
    int daysThisYear = (IsLeapYear(year) ? 366 : 365);
    //The number of days in the current year is now calculated instead.
    while (days > daysThisYear)
    {
        days -= daysThisYear;
        year += 1;
        daysThisYear = (IsLeapYear(year) ? 366 : 365);
    }

-------------------------------
不过我随便看了一下别的代码,写得很垃圾,好像是还没毕业的大一大二学生,根本没有发挥出C语言的优势。虽然我不是搞c的,帮他改一个地方,就是判断闰年这个函数 :
源代码这样,效率太低!
static int IsLeapYear(int Year)
{
    int Leap;

    Leap = 0;
    if ((Year % 4) == 0) {
        Leap = 1;
        if ((Year % 100) == 0) {
            Leap = (Year%400) ? 0 : 1;
        }
    }

    return (Leap);
}

我修改一下:
static int IsLeapYear(int Year)
{
    return (!(Year % 4) && (Year % 100) || !(Year % 400)) ? 1 : 0;
}

[ 本帖最后由 iamybj 于 2009-1-6 14:03 编辑 ]



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

扛着金箍棒,驾着七彩云,杀入UNIX世界!
jerrymy   帅哥 (I-am-legend!)
大天使


CU奥运火炬传递手2008
CU编号: 605034
注册:2007-8-19
最后登录: 2009-07-04
帖子:1996
精华:0

可用积分:2286 (小富即安)
信誉积分:5
专家积分:0 (本版:0)
空间积分:1866
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


4楼 发表于 2009-1-5 16:05 
终于抓到把柄了?



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

Hardware is indeterministically reliable。
Software is deterministically unreliable。
People are indeterministically unreliable。
Nature is deterministically reliable。
管理员 Send_linux
管理员-法王



CU奥运火炬传递手2008
CU编号: 149458
注册:2004-4-7
最后登录: 2009-07-04
帖子:15768
精华:7

可用积分:16019 (大富大贵)
信誉积分:100
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:CAU
状态:...离线...

[个人空间] [短信] [博客]


5楼 发表于 2009-1-5 16:48 


QUOTE:
原帖由 iamybj 于 2009-1-5 16:04 发表
366天肯定是闰年。
判断闰年只需要用年就能判断!能被4整除但不能被100整除,或者能被400整除的年份。

这签名档实在是太。。。 。。。



您对本贴的看法:鲜花[0] 臭蛋[0]
evaspring (0Lǒv绫波丽)
法师



CU编号: 463710
注册:2006-9-9
最后登录: 2009-07-04
帖子:6139
精华:0

可用积分:2788 (小富即安)
信誉积分:120
专家积分:12 (本版:0)
空间积分:0
推广积分:2

来自:土卫六
状态:...离线...

[个人空间] [短信] [博客]


6楼 发表于 2009-1-5 18:21 


QUOTE:
原帖由 iamybj 于 2009-1-5 16:04 发表
366天肯定是闰年。
判断闰年只需要用年就能判断!能被4整除但不能被100整除,或者能被400整除的年份。

没有那么简单。

没看懂新闻,是微软使用了开源代码么???

那么微软的代码审核有问题嘛 ~



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

宁静而不忧伤,执着而不偏激。
vbs100
精灵



CU编号: 645773
注册:2007-11-24
最后登录: 2009-07-04
帖子:242
精华:0

可用积分:445 (白手起家)
信誉积分:5
专家积分:30 (本版:0)
空间积分:0
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


7楼 发表于 2009-1-5 19:09 
典型的 off-by-one 错误 不应该啊



您对本贴的看法:鲜花[0] 臭蛋[0]
disheng727   帅哥
精灵




CU编号: 699412
注册:2008-4-30
最后登录: 2009-06-28
帖子:226
精华:0

可用积分:385 (白手起家)
信誉积分:0
专家积分:0 (本版:0)
空间积分:0
推广积分:0

来自:广州
状态:...保密...

[个人空间] [短信] [博客]


8楼 发表于 2009-1-5 19:13 
iamybj  的图像上的那个女的实在是恶心



您对本贴的看法:鲜花[0] 臭蛋[0]
chenyx   帅哥
法师


CU奥运火炬传递手2008
CU编号: 2008
注册:2001-12-24
最后登录: 2009-07-04
帖子:7628
精华:1

可用积分:2285 (小富即安)
信誉积分:96
专家积分:102 (本版:0)
空间积分:804
推广积分:0

状态:...保密...

[个人空间] [短信] [博客]


9楼 发表于 2009-1-5 19:56 
呵呵,MS这回糗大了。



您对本贴的看法:鲜花[0] 臭蛋[0]

__________________________________

宝剑锋从磨砺出,梅花香自苦寒来!!!

cheveu
光明使者




CU编号: 637835
注册:2007-11-5
最后登录: 2009-07-04
帖子:912
精华:0

可用积分:1079 (家境小康)
信誉积分:0
专家积分:5 (本版:0)
空间积分:2
推广积分:0

状态:...离线...

[个人空间] [短信] [博客]


10楼 发表于 2009-1-5 20:27 
那个很强的签名,是一个韩国片,叫《猛男诞生记》,推荐用来打发无聊时间,不错。



您对本贴的看法:鲜花[0] 臭蛋[0]

首页 » CU论坛 » Linux » 汇总贴列表 » 开源业界与评论 »

 


Copyright © 2001-2008 ChinaUnix.net All Rights Reserved     联系我们:

感谢所有关心和支持过ChinaUnix的朋友们    转载本站内容请注明原作者名及出处

京ICP证041476号


清除 Cookies - Linux时代 - Archiver - WAP - TOP

Processed in 0.048881 second(s), 5 queries , Gzip enabled