問題
mrubyにおいて、Cで記述したメソッドが、mruby側から渡された引数を受け取る際には、mrb_get_args()を使用する。
その際、mrubyから渡された引数の個数を受け取るための整数型のポインタは、mrb_get_args()内において、mrb_int型と定義されている。
https://github.com/mruby/mruby/blob/master/src/class.c
のmrb_get_args()を参照。
しかし、誤って、int型のポインタを渡しているmrb_gemが複数あり、sizeof(int) != sizeof(mrb_int)の環境において、問題が発生する。
mrb_intの型は、mrbconf.h及びvalue.h
において定義されており、環境に応じて、コンパイラオプションで再定義することが想定されている。
実際に遭遇した現象
mrb_intの型を64bit整数型と定義したところ、あるmrb_gem内でmrb_get_args()呼び出し時に、引数の個数を受け取る変数の型がintだったため、別の引数であるmrb_stateのポインタが破壊されてNULLになり、直後にNULLポインタにアクセスしてプロセスが異常終了した。
なぜ直接バグレポートせずにここに?
1箇所手元で修正したが、別の箇所でも再現したため、使用中のmrb_gemを総当りで調べたところ、他の箇所にも同じ問題が発見され、該当するプロジェクトに順に報告する際の説明のために、ここに記述した。
ということで、これから順にバグ報告に行ってきます……