バイナリデータ-アイテムデータの解析の謎

おもしろかったら友だちとシェアしよう!

この問題はプログラマー向けのものです。バイナリーデータとか構造体という言葉がわからない方には難しいと思いますよ!

あるゲームのプログラムを任されました。バグ調査のためにメモリーをチェックする羽目に。

定義されている構造体は以下のようになっていました。

typedef struct _item {
	int number;
	int count;
} item_t;

typedef struct _user {
	char *name;
	int status[8];
	item_t item[3];
	int flag;
} user_t;

ユーザーデータのメモリ位置を突き止めたところ以下のようになっていました。

80 6c e0 cf 14 00 00 00 32 00 00 00 50 00 00 00
30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 01 00 00 00 24 80 00 00 07 00 00 00
02 e0 15 20 04 00 00 00 02 00 00 80 13 44 77 fc
c0 6c e0 cf 14 00 00 00 14 00 00 00 28 00 00 00

バグは「アイテムの数がマイナスを表示する。どのアイテムかはわからない」というもの。

さてマイナス表示されているアイテムのnumberは?
(リトルエンディアン、intとポインタは32ビット、アラインメントは行われないものとします。)

答え

numberが4のアイテム(3番目に入っているアイテム)

[c highlight=”4″] 80 6c e0 cf 14 00 00 00 32 00 00 00 50 00 00 00
30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
01 00 00 00 01 00 00 00 24 80 00 00 07 00 00 00
02 e0 15 20 04 00 00 00 02 00 00 80 13 44 77 fc
c0 6c e0 cf 14 00 00 00 14 00 00 00 28 00 00 00
[/c]

ハイライトされている行の「04 00 00 00 02 00 00 80」が該当のアイテムです。numberにあたるのが「04 00 00 00」で4、countにあたるのが「02 00 00 80」となっています。最後のデータが80となっています。intの正負のフラグは最上位ビットですので負の数字になっていることがわかります。

ちなみに原因と考えられるのは、単純にアイテム数デクリメント制御での間違いか、もしくは、ポインタを使用していることはわかっているので、全然別の箇所でのポインタ制御不具合を起因とする異常なメモリ書き込みでしょうか。前者なら簡単な修正作業ですが、後者なら…南無〜…ですね。