いけむランド

はてダからやってきました

SO905i / M702iG / M702iS の不具合

さて、今回も根拠レスな憶測をしてみる。

SO905i

今回明らかにされたのは、スケジュール登録を繰り返し行なうと、「メモリに空きがありません」と表示され、データの追加が行なえなくなるという不具合。スケジュールデータをメモリカードに退避することで問題を回避することもできるが、ソフトウェア更新を行なえば、この事象は発生しなくなる。

完全に憶測だが、スケジュール登録に使用する作業領域を alloc して、スケジュールの登録後に free するのを忘れてたとかいうオチだろうか?
だけど、単なる作業領域だと他のアプリも「メモリに〜」で動かなくなるような気がする。

...待てよ。それなら、作業領域内で単一のプロセスが使える制限にかかったためという可能性も考えられるなぁ。

M702iG / M702iS

不具合は、端末のオールロック中に目覚ましアラームを設定すると、設定時刻にアラーム音は鳴らないものの、スヌーズ設定をしていた場合に設定時刻の約11分後に鳴り出すというもの。不具合修正後は、オールロック中には目覚ましアラームが完全に鳴らないように修正される。

数字が出てくると、何かしらこじつけたくなる。
無理やり考えた結果、16 bit で表現可能なビットパターン数 65536 ≒ 11(min) * 60 (sec/min) * 100 (count/sec) という式に至る。
1 sec で 100 回 (つまり 10ms で 1 回) インクリメントするカウンタがあると仮定すると、約 11 分で 16 bit レジスタがオーバーフローする。
オーバーフローしたせいで設定時刻を勘違いしてしまったというのはどうだろう?
だけど、16 bit レジスタのカウンタというのはかなり無理がある仮定のような気がする。

また、着信履歴にも不具合が発見された。M702iGM702iSはいずれも最大60件まで着信履歴が保存されるが、59件目までしか履歴が残らない場合がある。

履歴の配列の直後に別の配列があって、別の配列に対するちょっとお行儀の悪い式が履歴の配列を破壊しちゃったというのはどうだろう?

  History history[60], a[10];
  int i;
    :
  a[i-1] = ...; // i==0 の場合 a[-1] は history[59] かもしれない。
    :