パスワードを忘れた? アカウント作成
44112 story

Zuneとgigabeatが閏年の処理の問題でフリーズ 71

ストーリー by soara
つい今しがた復帰しました 部門より

achika_j_kuonji 曰く、

Microsoft社のZune 30GB版が12月30日から31日にかけてフリーズしたという苦情が同社に殺到したとCNNが報じている。また、東芝のgigabeat Tシリーズ・Vシリーズにおいても同様の現象が発生していたようで、まとめwikiが作られている(東芝のgigabeat公式サイトには現在は情報は掲載されていない)。

Zuneでこれらの現象が起こった原因は、閏年を扱うルーチンにバグがあったためとCNNは報じている。Zuneの公式サイトのFAQには、フリーズした場合はバッテリーを放電し、GMTで2009年1月1日の正午以降に充電すれば回復するとある。gigabeatも同様の方法で回復するようだ。

閏年の処理というのは基本中の基本であり、何故このようなバグが残ったまま出荷されたのが疑問である。

Zuneに関しては本家記事も参照されたし。

2008/01/01 22:15 追記 by soa; タイトル中 gigabeatとすべきところを Gigabeatとしていました。新年早々間違いを犯してしまい申し訳ありませんでした。#1484221のAnonymous Coward氏のご報告には感謝いたします。ありがとうございました。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • by Anonymous Coward on 2009年01月01日 22時11分 (#1484223)
    まさか、うちで使っているライブラリに、そんな初歩的なバグがあるわけがない。
  • by Anonymous Coward on 2009年01月01日 23時26分 (#1484253)
    2009年1月1日にフリーズするバグを抱えた、そのものずばりのgigabeat T401Sが
    2009年1月1日発売のヨドバシカメラ福袋(デジタルオーディオの夢)で大量に販売されたようです

    買って帰って電源入れたらフリーズ。なんというか…
    • なんと言う、ヨドバシショック。
      苦情が殺到する可能性もあるわけですか・・・・。

      これだからガノタは・・・・
  • by Anonymous Coward on 2009年01月01日 23時51分 (#1484260)
    Freescaleの参照ドライバがバグっていた模様です。
    閏年の判断が間違ってたわけじゃなくて、1980年1月1日からの日数を閏年を考慮して年初からの日数に直すところで無限ループに入っていたという…
    http://www.zuneboards.com/forums/zune-news/38143-cause-zune-30-leapyea... [zuneboards.com]
    • by Anonymous Coward on 2009年01月02日 2時08分 (#1484292)
      件のコードでは日数が1年分以上ある場合は1年分の日数を減じて年をひとつ増やすという方法で、年と元日からの日数を算出している訳ですが、if (days > 366) のガード条件の後付けっぽい不自然さが、こんな感じで場当たり的に作られたものな感じを受けます。

      ・年は日数が365以下になるまで365が何回引けたか数えればいいかな
      ・残った日数は次の処理で使えるしね
      ・あれ? うるう年の時は1年は366日だよ!
      ・あぶないあぶない。うるう年の時は366を引くようにして、と
      ・(同僚) ねえ。この処理だと days が減りすぎちゃう時がない?
      ・あ、そうだね。じゃあ、引き過ぎにならないようにif文で確認して、と
      ・ありがとう! これで完璧だよ!

      で、テストしてない、と……

      親コメント
    • by Anonymous Coward on 2009年01月02日 7時08分 (#1484319)
      重箱の隅つつくけど、
      参照ドライバって言い方します?
      リファレンスドライバのことだと思うんですが、あえて言うなら純正ドライバ?基準ドライバ?
      親コメント
      • by Anonymous Coward
        参照実装という言葉は時々聞く気がする。良い訳語だとは思わないけど、とにかく存在する。

        組み込み系とそれ以外との文化の相違の問題である…のかどうかは存じません。
    • by Anonymous Coward
      素直に書けば、これだけのこと?

      year = ORIGINYEAR; /* = 1980 */
       
      while (days > (IsLeapYear(year) ? 366 : 365))
      {
        days -= IsLeapYear(year) ? 366 : 365;
        year += 1;
      }
      • by Anonymous Coward
        教科書的に書けばこんな感じ。

        year = ORIGINYEAR; /* = 1980 */
        year_days = IsLeapYear(year) ? 366 : 365;
        while (days > year_days)
        {
            days -= year_days;
            year += 1;
            year_days = IsLeapYear(year) ? 366 : 365;
        }
        • by Anonymous Coward on 2009年01月02日 3時40分 (#1484307)
          両方とも、「IsLeapYear(year) ? 366 : 365;」が複数箇所に記述されてるのは駄目だろう。
          この程度なら余裕で見通せるだろうが、基本的に同一の記述が複数にあると潜在バグの元になる。
          過去の遺産的なつぎはぎ修正のプログラムは、たいていこんなものが散見されて、コピペミスと思われるバグがあったりするよ。
          親コメント
          • by Anonymous Coward
            つまり、実用的に書くとこんな感じ?

            year = ORIGINYEAR; /* = 1980 */
            while (1)
            {
                if (IsLeapYear(year))
                {
                    if (days <= 366) break;
                    days -= 366;
                }
                else
                {
                    if (days <= 365) break;
                    days -= 365;
                }
                year += 1;
            }
            • by Anonymous Coward
              この場合はforで書いたほうが読みやすいよ。

              for (year = ORIGINYEAR; ; year++)
              {
                  if (IsLeapYear(year))
                  {
                      if (days <= 366) break;
                      days -= 366;
                  }
                  else
                  {
                      if (days <= 365) break;
                      days -= 365;
                  }
              }
              • by Anonymous Coward on 2009年01月02日 9時40分 (#1484333)
                これ、実用的なの?ifの中身を同じアルゴリズムにするのと、ローカル変数を一つ増やすのとの差でしょ?

                for (year = ORIGINYEAR;; year++) {
                  year_days = IsLeapYear(year)? 366 : 365;
                  if (days <= year_days)
                    break;
                  days -= year_days;
                }
                おそらく、組み込み系にとっての、という意味だと思うが…。
                親コメント
              • by Anonymous Coward on 2009年01月02日 14時01分 (#1484375)
                三項演算子を知らないプログラマがいるからです。
                保守性を考えた場合、底辺に合わせるしかありません。
                親コメント
              • by Anonymous Coward on 2009年01月02日 14時41分 (#1484385)
                三項演算子も知らないプログラマに保守できるように書いちゃったら自分がクビを切られちゃうじゃないですか!
                管理側の発想としてはとてもよく理解できますけど。
                親コメント
              • MISRA-Cだと,三項演算子の使用もif-elseでのカッコの省略も,ルール逸脱ってことで文書を上納しなければならなかったりしたような.面倒.

                // 個人的にはコーディングスタンダード嫌いなID
                --
                from もなか
                親コメント
  • はいはい (スコア:2, おもしろおかしい)

    by Anonymous Coward on 2009年01月01日 22時59分 (#1484242)
    orz ズーン
  • by Anonymous Coward on 2009年01月01日 22時04分 (#1484221)
    直して
  • T401を使っていますが、今回の件もさることながら無線LANが微妙なんですよ。
    フレッツ・スポットに接続して、次回無線LAN接続しようとすると(フレッツ・スポットであろうとなかろうと)接続できなかったりします。
    • 自分もT802を使ってるんですが、ポッドキャストのダウンロード中に引っかかったままで放置プレイ状態になったりします。
      自宅の無線LAN(NEC Atermシリーズ)でもYahooのBBモバイルポイント(マクドナルドで利用)でも。
      でもうまくダウンロードできる時もあるし、再現性がないので打つ手なしです。
      まぁ何度か試してるうちにダウンロードできているので実用上は重大な問題はないのですが・・・
      ダウンロード中の挙動をもうちょっと詳細に表示してくれるとか、
      できればログファイルを残してくれるとかするとありがたいんですが。
      --
      屍体メモ [windy.cx]
      親コメント
  • iPodは...と確認してみたけど大丈夫でした。
    しかし担当者にとっては相応のオオゴトだろうけど、お客さんにとってはそれほどでなかったりして。
    対処可能のようだし燃えたりするわけじゃないし。
  • by Anonymous Coward on 2009年01月02日 8時12分 (#1484324)
    何も中身ないじゃん。これだったら、gigabeatの何かのページ追記してくれる方がまし。
  • DoCoMoのNも (スコア:1, 参考になる)

    by Anonymous Coward on 2009年01月02日 11時53分 (#1484349)
    2009/1/1にアプリからSDカードにアクセスできないバグ有り。
  • by Anonymous Coward on 2009年01月01日 22時39分 (#1484231)
    閏秒の処理は…
typodupeerror

皆さんもソースを読むときに、行と行の間を読むような気持ちで見てほしい -- あるハッカー

読み込み中...