ZAPAnet総合情報局 > ZAPAブログ2.0 > うるう年の誤判定でPS3本体にバグ発生

うるう年の誤判定でPS3本体にバグ発生

2010年03月02日 ゲーム全般


2010年3月1日に発生したPlayStation 3のバグ。内容は、今までPS3でプレイして集めた「トロフィーが消える」という重大なバグのようにも思われました。

「PlayStation Networkに接続するとセーブデータが全て消える」、などという噂も広がり、PS3ユーザーはうるうるする事態となっていました。


1日経ち、3月2日になるとこのバグは自然回復。

バグの原因

何が原因だったかというと、「PS3®(新型PS3®を除く)に使用している時計機能のバグが原因」でした。
SONYの対応もまずまず早く、3月2日にはバグを認め、障害例の発表をしました。
ただいま、PlayStation®3(PS3®)をご利用の一部のお客様の環境において、PS3®(新型PS3®を除く)に使用している時計機能のバグが原因による問題が発生しており、以下のような障害が確認されています。

(障害例)
・PS3®本体の日付が2000/01/01になってしまう。
・PlayStation®Networkにサインインしようとすると「エラーが発生したため、“PlayStation Network”からサインアウトしました。(8001050F)」とエラーが表示される。
・ゲームを起動しようとすると「トロフィー情報の登録に失敗しました。(8001050F)」とエラーが表示され、トロフィーデータが表示されなくなる。
・インターネット経由での日付と時刻の設定を行うと「時刻設定に失敗しました(8001050F)」とエラーが表示される。
・PlayStation®Storeで購入したレンタル方式のビデオが有効期限内であっても、再生できない。

PlayStation®3にて発生していた障害について

続いて、「PS3に使用している時計機能が2010年をうるう年と認識」して起こったバグであることと、日付が変わってバグが直ったことを発表しました。
PlayStation®3(PS3®)をご利用の一部のお客様の環境において、PS3®(新型PS3®を除く)に使用している時計機能が2010年をうるう年と認識していました。PS3®内部の日付が2月29日(GMT/グリニッジ標準時間)から実際に存在する3月1日(GMT)に変わったことで、昨日から発生していた障害は解消され、お持ちのPS3®は正常に動作することを確認いたしました。なお、XMB™上の時刻のずれが生じている場合は、PS3® の「日付と時刻」を手動またはインターネット経由で正しく設定してくださいますようお願い申しあげます。本件について新しい情報がある場合は速やかにお知らせいたします。

PlayStation®3をご利用のお客様へ


ようするに、PS3の時計機能プログラムの「うるう年の判定をミスった」のが原因で起きたバグでした。
PS3本体は2月29日で、ネットワーク上の正しい日付が3月1日だったために、整合性がとれなくてサインインできなくなったようです。

「うるう年の判定」というと、プログラミングの初級本に例題として取り上げられるくらいポピュラーな問題です。
if文の条件判定を理解させる時によく使われる例題です。

アメリカ空軍が軍用のスーパーコンピューターとして2000台以上導入しているPS3。
その最新ゲーム機PS3では、うるう年の判定をミスし、「2010年をうるう年」と判定してしまったようです。

2010年をうるう年と判定?

どうして2010年をうるう年と判定してしまったのか

どうして2010年をうるう年と判定してしまったのか、プログラマとして興味のあるところです。

うるう年の判定は、閏年 - Wikipediaでは、
1. 西暦年が4で割り切れる年は閏年
2. ただし、西暦年が100で割り切れる年は平年
3. ただし、西暦年が400で割り切れる年は閏年
で、「コンピュータシステムと閏年」の関係まで掲載してあります。
コンピュータシステムにおいて閏年を判定するアルゴリズムの記述には問題がある場合が多く、しばしばこれが原因でシステムは重大な障害を起こす。これは例えば、「4で割り切れる年」としかしていなかったり、year==2000||year==2004のようにある程度先の閏年しかコードしていないなどが挙げられる。

グレゴリオ暦の閏年は次のようにすると正しく判定できる。

* year%4 == 0 && (year%100 != 0 || year%400 == 0) (C言語など)
* year Mod 4 = 0 And (year Mod 100 <> 0 Or year Mod 400 = 0) (Visual Basic など)

「2010年がうるう年」と判定させるには、「西暦が4で割り切れれば全てうるう年!」くらいの大雑把な判定処理をしないといけないことになります(2010は4では割り切れないため、偶数なら全てうるう年くらいじゃないとダメなんですが)。
ただ、最新ゲーム機PS3でそんな初歩的なミスをしたとは考えにくく、新型PS3で同様のバグが発生しなかったことも不思議に思えます。
例えば、「新型ではこっそり修正した」のであれば、このような騒ぎを起こす前に告知するなり、ソフトウェア上で対処するなど考えられるため、こっそり修正したとも思えません。

2010年問題か

今回のうるう年の誤判定バグは、こんなパターンが考えられます。
1.西暦から2000を引いて、下2桁の年数を取り出していた。
2.今年は2010年なので、取り出していた10(10進数)でうるう年判定しようとしたら、実は0x10(16進数)になっていた。
3.16進数の10は10進数では16であり、2016年はうるう年なので、今年はうるう年と判定。
こんなパターンだったのではないでしょうか(詳細はわかりませんが)。
新型と旧型のPS3本体では、時計関係のチップか何かが変わっていてバグが起きなかったのではないかと思います。

すでに2010年に入った時に、ドイツのキャッシュカードやクレジットカードに埋め込まれたチップで2010年を認識しないバグが発生しています。
同様にオーストラリアでもエラーが発生し、韓国でも発生しています。
また、日本でもCITIZENの腕時計が2010年問題でバグが発生しています。

「2000年問題」は日本中で話題になりました。
今回のPS3の件は、いくつかの場所で起きていた「2010年問題」だったと考えることができそうです。
問題が起きたのが幻の2月29日だけだったのが不幸中の幸いでした。
PS3ユーザーはセーブデータが消えずにほっとしたことだと思います。
うるうるしないですみました。