LoginSignup
3

More than 5 years have passed since last update.

mrb_get_argsを使用して可変長引数の個数を取得する際の型はmrb_int

Last updated at Posted at 2014-08-26

問題

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を総当りで調べたところ、他の箇所にも同じ問題が発見され、該当するプロジェクトに順に報告する際の説明のために、ここに記述した。


ということで、これから順にバグ報告に行ってきます……

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3