制作日記

こういうの作った方が、逃げにくいじゃない

float型のサイズの話が凶悪キャラの新mugen対応の話にまで広がった

まずはC言語の話ね、MUGENが全く絡まないわけではないが

サイズを規格でキッチリ指定するとは思えないし、処理系定義な気がする
てな感じで、とある事情からずっともやもやしてた
ということで、C99のJIS規格にちゃんと目を通した

やっぱ、処理系定義だわ

規格書ですら、floatが単精度、doubleが倍精度って扱ってるとこがあった気がするけど、
floatはdoubleの部分集合、doubleはlong doubleの部分集合ってのは定義されてるだけ
それ以上は何も書いてない

たまに型のサイズを答えさせる問題あるけどさ、
char,unsigned char, signed char以外は全部処理系定義だよな!?
C99以降はu8_tだっけ?とか増えたけど、そんなの答えさせる問題見たことない

C言語の思想として、処理系定義なんだろうなーってのはわかるけど、
やっぱりこうやって規格をしっかり確認しないと駄目だねー

で、MUGENの話に無理やり持っていく
というわけで、float型はサイズも精度も基数も全部処理系定義
つまり、マイクロソフトがトチ狂ってfloat型を8バイトにする可能性がないこともない
100%ないとは言い切れない、世の中なにがあるかわからんからね

そうすると、キャラの構造体のサイズとかも変わってくるわけよ
つまり、新mugen対応凶悪キャラ作っても、超即死とかズレる可能性が……

ここまでの話は、まず起こらない仮定だけど、
凶悪キャラは実装に強く依存しているから、開発中の新MUGENに対応するのってリスク高いのよね
気まぐれでステータス一つ増やすだけで、超即死とかズレるよね
キャラ構造体のメンバの順番並び替えても、ズレるよね

ということで、今新MUGENに対応しても、将来的に動かなくなる可能性もあるのよ

左辺値

唐突に、C言語の話

昔?は左辺値って何を意味してるのか全く分からんかった
最初は左オペランドのことかと思ってた
実際そういう勘違いしてる人も結構いるみたい
元々はそっから意味取ってきてるけどね

で、規格書とか読んでると、その解釈では明らかに意味が通らないんだよね
そこらへんの用語って規格書を読み進めないと載ってないんだよね

左辺値も規格書には一応項目あるけど、34ページ目
小説とかみたいに1ページ10秒で読めたりしないから、順番に読んでるとかなり時間かかる

つーか、あそこの注釈は個人的にはANSII(英語)のほうがわかりやすい

C11ドラフト版より引用
The name ‘‘lvalue’’ comes originally from the assignment expression E1 = E2, in which the left
operand E1 is required to be a (modifiable) lvalue. It is perhaps better considered as representing an
object ‘‘locator value’’. What is sometimes called ‘‘rvalue’’ is in this International Standard described
as the ‘‘value of an expression’’.

ANSIIは途中で読むの挫折したけどね
さすがにあの技術英語を正確に理解するのは無理だった

Assert failure in p-update.c line 241

やっと、時間ができたんで見てみた
結論として、プレイヤー数とかプレイヤーアドレス絡み

アセンブラ読んでの静的解析オンリーで、実動作見てないから裏取りはしてない
それと、前提知識として以下記事を読んでおくこと
http://drabs.blog40.fc2.com/blog-entry-1109.html

行数とエラーメッセージ的に、出してるとこは↓臭い
上リンクの記事で載せてるアセンブラの最後の方、004408ABから飛んでくる
playerenable云々のチェックの次

* Referenced by an (U)nconditional or (C)onditional Jump or (c)all at Address:
| 004408AB(C)
|
004408CC 8B8C9850B70000 mov ecx, [eax+ebx*4+0000B750h] <<<<< eax+0000B750hでプレイヤーアドレスリストの先頭
<<<<< それにebx(多分ヘルパーとか込みのプレイヤー数)*4を足す
<<<<< つまり、存在している中では最終のプレイヤーのアドレスをecxに取得
004408D3 85C9 test ecx, ecx <<<<< それが0か否か
004408D5 7534 jnz 0044090Bh <<<<< 0でなければ問題なし、以下のエラー処理を飛ばす
004408D7 68F1000000 push 000000F1h <<<<< 0xF1=241をスタックに積む

* Possible string reference 4A9F40h "D:\mugenw\src\mugen\p-update.c"
|
004408DC 68409F4A00 push 004A9F40h
004408E1 E86A86FDFF call 00418F50h <<<<< パス名からファイル名を取得するサブルーチンと思えばおk
004408E6 83C404 add esp, 04h
004408E9 50 push eax <<<<< 上のサブルーチンで取得したファイル名をスタックに積む

* Possible string reference 4A9F60h "Assert failure in %s line %i"
|
004408EA 68609F4A00 push 004A9F60h <<<<< Assert~をスタックに積む
004408EF 68606D4B00 push 004B6D60h <<<<< 直下のサブルーチンで作った文字列を書き込むアドレスをスタックに積む
004408F4 E85E190500 call 00492257h <<<<< 引数的にsprintf的な関数、エラーメッセージ作る処理
004408F9 68606D4B00 push 004B6D60h <<<<< 直上のサブルーチンで作った文字列をスタックに積む
004408FE E8CD7EFDFF call 004187D0h <<<<< 多分、メッセージボックス出す処理?
00440903 A14C5B4B00 mov eax, [004B5B4Ch]
00440908 83C414 add esp, 14h

MtG20周年

記念サイトなんてあるじゃないですか
http://mtg-jp.com/20th/

こないだ15周年かと思ったら、もう20年っすか

気合い入れてやってたのは、ウルザ、マスクスブロック辺り、大体5~6版頃
13-4年ぐらい前だから、今や古い部類に入るんだよなー


というか、記念サイト年表のトピックス
GAMEぎゃざ創刊載せるなら、ぎゃざ娘の表紙画像をだな!

-1F攻撃

以前SAM氏のブログで話題に上ってたけど、
C言語がどうとか、WinAPIがどうとか言ってるってことは、デバッガ的なものでも作ったんじゃねーの?

外から弄って良いならバッチファイルで事足りる

sffとかはデフォで入ってるやつ使えばいいから、
echo使って、defファイルとcnsを吐いて、selectdefを上書き
あとは1P,2Pを指定してmugen叩けばおk

別に1P2Pを指定しなくても、
selectdef書き換えてるから特定のキャラ以外選択することさえできない

これで-1Fどころか起動前攻撃っすね!
プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク